一对多案例
一个用户可以发布多个帖子
项目流程:从login.jsp处登陆,然后点击index.jsp的’‘提个问题’'按钮跳转到add.jsp页面填写paste表单并存放到数据库中
创建动态web工程HibernateForum并在lib文件下导入jar包并buildPath
hibernate相关jar包
antlr-2.7.7.jar
byte-buddy-1.8.12.jar
classmate-1.3.4.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-5.0.4.Final.jar
hibernate-core-5.3.2.Final.jar
jandex-2.0.5.Final.jar
javassist-3.22.0-GA.jar
javax.activation-api-1.2.0.jar
javax.persistence-api-2.2.jar
jboss-logging-3.3.2.Final.jar
jboss-transaction-api_1.2_spec-1.1.1.Final.jar
struts相关jar包
commons-fileupload-1.3.3.jar
commons-io-2.5.jar
commons-lang3-3.6.jar
commons-logging-1.1.3.jar
freemarker-2.3.26-incubating.jar
javassist-3.20.0-GA.jar 这个jar包用hibernate中的就行
log4j-api-2.10.0.jar
ognl-3.1.15.jar
struts2-core-2.5.16.jar
mysql驱动包
mysql-connector-java-8.0.16.jar
javaSE9以上需要导入的包
jaxb-api-2.3.0.jar
jaxb-core-2.3.0.jar
jaxb-impl-2.3.0.jar
在webContent下导入html,css和js文件
下面只展示用到了html和jsp页面
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="css/head.css" />
<link rel="stylesheet" type="text/css" href="css/login.css" />
</head>
<body>
<div class="dvhead">
<div class="dvlogo">
<a href="index.html">你问我答</a>
</div>
<div class="dvsearch">10秒钟注册账号,找到你的同学</div>
<div class="dvreg">
已有账号,立即 <a href="login.html">登录</a>
</div>
</div>
<section class="sec">
<form action="${pageContext.request.contextPath }/UserAction_login" method="post">
<div class="register-box">
<label for="username" class="username_label"> 用 户 名 <input
maxlength="20" name="username" type="text" placeholder="您的用户名和登录名" />
</label>
<div class="tips"></div>
</div>
<div class="register-box">
<label for="username" class="other_label"> 密 码 <input
maxlength="20" type="password" name="password"
placeholder="建议至少使用两种字符组合" />
</label>
<div class="tips" style="color:red"> <s:property value="error"/> </div>
</div>
<div class="arguement">
<input type="checkbox" id="xieyi" /> 阅读并同意 <a
href="javascript:void(0)">《你问我答用户注册协议》</a> <a href="register.html">没有账号,立即注册</a>
<div class="tips"></div>
</div>
<div class="submit_btn">
<button type="submit" id="submit_btn">立 即 登录</button>
</div>
</form>
</section>
<script src="js/index.js" type="text/javascript" charset="utf-8"></script>
</body>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="css/index.css">
</head>
<div class="dvhead">
<div class="dvlogo"><a href="index.html">你问我答</a></div>
<div class="dvsearch">10秒钟注册账号,找到你的同学</div>
<div class="dvreg">
已有账号,立即 <a href="login.html">登录</a>
</div>
</div>
<div class="dvContent">
<div class="dvquesleft">
<div class="dvqstitle">
<image class="imgbean" src="images/bean.jpg">
<span class="qsTitle">问答</span>
<span class="back"><ab href="">《《返回上一页</a></span>
</div>
<div class="dvtabhead">
<div class="tabheads tabcurrent">全部问题</div>
<div class="tabheads">我的问题</div>
<div class="tabheads">关注问题</div>
<div class="tabheads">问题标签</div>
</div>
<div class="tabContent">
<div class="dvtags">
<a class="curenttag">待解决</a><span class="line"></span><a>高分</a><span
class="line"></span><a>新回答</a><span class="line"></span><a>已解决</a>
</div>
<div class="tab">
<div class="dvques">
<div class="quesCount">
<div class="count">8</div>
<div class="ques">回答数</div>
</div>
<div class="quesContent">
<div class="quesTitle">
500
<image src="images/bean.jpg" class="bean"> <span
class="spanques">Excel开发的问题</span>
</div>
<div class="qContent">以前都是OWC控件在程序中做Excel做操作,主要包裹以前裹做Excel做操作,主要包裹以前都是OWC控件在程序中做Excel做操作,主要包裹主要包裹以前都是主要包中做Excel做操作,主要包裹,主要包裹...</div>
<div class="tags">
<span class="tag">excel</span><span class="tag">程序</span>
</div>
<div class="quesUser">
<image src="images/0.gif" class="imguser" />
<div class="userName">
张大值
<div class="liulan">浏览(9) 30分钟前</div>
</div>
</div>
</div>
</div>
</div>
<div class="tab hidden">2</div>
<div class="tab hidden">3</div>
<div class="tab hidden">4</div>
</div>
</div>
<div class="dvquesright">
<div>
<buton class="btnques" οnclick="location.href='add.jsp'">提个问题</buton>
</div>
<div class="dvorder">
<div class="orderTitle">专家排行榜</div>
<div class="users">
<image class="userface" src="images/0.gif" />
<div class="dvuser">
<div class="userTitle">陈有龙</div>
<div class="userdeital">大牛6级 豆:14006</div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(function()
{
$(".tabheads").click(function()
{
$(".tabheads").removeClass("tabcurrent").eq($(this).index()).addClass("tabcurrent");
$(".tab").hide().eq($(this).index()).show();
});
});
</script>
<body>
</body>
</html>
add.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>发表问题</title>
<meta name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="css/head.css" />
<link rel="stylesheet" href="layui/css/layui.css">
<link rel="stylesheet" href="css/global.css">
<script src="layui/layui.js"></script>
</head>
<body>
<div class="dvhead">
<div class="dvlogo">
<a href="index.html">你问我答</a>
</div>
<div class="dvsearch">10秒钟注册账号,找到你的同学</div>
<div class="dvreg">
已有账号,立即 <a href="login.html">登录</a>
</div>
</div>
<div class="main layui-clear">
<div class="fly-panel" pad20>
<h2 class="page-title">发表问题</h2>
<!-- <div class="fly-none">并无权限</div> -->
<div class="layui-form layui-form-pane">
<form action="${pageContext.request.contextPath }/PasteAction_addPaste">
<div class="layui-form-item">
<label for="L_title" class="layui-form-label">标题</label>
<div class="layui-input-block">
<input type="text" id="L_title" name="title" required
lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<div class="editor">
<textarea id="content" name="content"
style="width: 1040px; height: 450px; visibility: hidden;"></textarea>
</div>
</div>
<label for="L_content" class="layui-form-label" style="top: -2px;">描述</label>
</div>
<div class="layui-form-item">
<label for="L_title" class="layui-form-label">悬赏</label>
<div class="layui-input-block">
<input type="number" name="offer" required lay-verify="required"
autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
</div>
</form>
</div>
</div>
</div>
<script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'content',
resizeMode : 1,
cssPath : './index.css',
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script>
<script>
layui.cache.page = '';
layui.cache.user = {
username : '游客',
uid : -1,
avatar : '../res/images/avatar/00.jpg',
experience : 83,
sex : '男'
};
layui.config({
version : "2.0.0",
base : '../res/mods/'
}).extend({
fly : 'index'
}).use('fly');
</script>
</body>
</html>
在web.xml中配置相关文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>HibernateForumTest</display-name>
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
在mysql数据库中创建名为hibernatelearn数据库和user、paste表
创建各个包和class类
com.sikiedu.domain
Paste.java
package com.sikiedu.domain;
public class Paste {
private String id;
private String title;
private String content;
private Integer offer;
private Integer ansnum;
private Integer glanceover;
private String createtime;
//hibernate不需要获取userid 直接获取到user即可 一个帖子属于一个用户
private User user;
//这里省略get和set方法以及有参和空参构造器
}
Paste.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.sikiedu.domain">
<class name="Paste" table="paste">
<id name="id">
<generator class="uuid"></generator>
</id> <!-- 主键用id表示 -->
<property name="title" column="title"></property>
<property name="content" column="content"></property>
<property name="offer" column="offer"></property>
<property name="ansnum" column="ansnum"></property>
<property name="glanceover" column="glanceover"></property>
<property name="createtime" column="createtime"></property>
<!-- 多对一的配置 外键用many-to-one 或者one-to-many-->
<!-- name:引用属性名
class:与它关联对象的完整类名
column:外键的列名
-->
<!-- inverse:配置关系是否不维护
true: 不维护
false:维护关系
insert属性:性能优化 无论怎么放弃维护,总有一方需要维护
按照默认值来就可以
一般的开发中,一的一方放弃维护,多的一方不放弃维护
-->
<many-to-one name="user" class="User" column="userid" insert="true"></many-to-one>
</class>
</hibernate-mapping>
User.java
package com.sikiedu.domain;
import java.util.HashSet;
import java.util.Set;
public class User {
private String id;
private String username;
private String password;
private String name;
private String email;
private String telephone;
//一个用户可以对应多个表 用set 里面的键不能重复
private Set<Paste> pasteSet =new HashSet<Paste>();
//这里省略get和set方法以及有参和空参构造器
}
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.sikiedu.domain">
<class name="User" table="user">
<id name="id">
<generator class="uuid"></generator>
</id>
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="name" column="name"></property>
<property name="email" column="email"></property>
<property name="telephone" column="telephone"></property>
<!-- name:集合属性名字
column:外键列名 class:与它相关的对象的完整类名
一对多的关系
cascade:级联操作
save-update :级联保存 级联更新
delete :级联删除
all
-->
<!-- inverse:配置关系是否不维护
true: 不维护
false:维护关系
-->
<set name="pasteSet" cascade="" inverse="false">
<key column="userid"></key>
<one-to-many class="Paste"/>
</set>
</class>
</hibernate-mapping>
com.sikiedu.dao
PasteDao.java
package com.sikiedu.dao;
import org.hibernate.Session;
import com.sikiedu.domain.Paste;
import com.sikiedu.utils.HibernateUtils;
public class PasteDao {
public void addPaste(Paste paste) {
Session session=HibernateUtils.getCurrentSession();
session.save(paste);
}
}
UserDao.java
package com.sikiedu.dao;
import org.hibernate.Session;
import org.hibernate.query.NativeQuery;
import com.sikiedu.domain.User;
import com.sikiedu.utils.HibernateUtils;
public class UserDao {
//原生SQL查询
public User findUser(User user) {
Session session=HibernateUtils.getCurrentSession();
String sql="select * from user where username=? and password=?";
NativeQuery query = session.createSQLQuery(sql);
query.setParameter(1, user.getUsername());
query.setParameter(2, user.getPassword());
query.addEntity(User.class);
User temp = (User) query.uniqueResult();
return temp;
}
}
com.sikiedu.service
PasteService.java
package com.sikiedu.service;
import org.hibernate.Transaction;
import com.sikiedu.dao.PasteDao;
import com.sikiedu.domain.Paste;
import com.sikiedu.utils.HibernateUtils;
public class PasteService {
public void addPaste(Paste paste) {
PasteDao pasteDao=new PasteDao();
//添加事务
Transaction beginTransaction = HibernateUtils.getCurrentSession().beginTransaction();
try {
pasteDao.addPaste(paste);
} catch (Exception e) {
beginTransaction.rollback();
}
beginTransaction.commit();
}
}
UserService.java
package com.sikiedu.service;
import org.hibernate.Transaction;
import com.sikiedu.dao.UserDao;
import com.sikiedu.domain.User;
import com.sikiedu.utils.HibernateUtils;
public class UserService {
//控制事务
public User findUser(User user) {
UserDao userDao=new UserDao();
Transaction transaction = HibernateUtils.getCurrentSession().beginTransaction();
User temp=null;
try {
temp=userDao.findUser(user);
} catch (Exception e) {
// TODO: handle exception
transaction.rollback();
}
transaction.commit();
return temp;
}
}
com.sikiedu.utils
HibernateUtils.java
package com.sikiedu.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static SessionFactory sessionFactory=null;
static {
Configuration config=new Configuration().configure();
sessionFactory= config.buildSessionFactory();
}
public static Session getSesion() {
return sessionFactory.openSession();
}
public static Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
}
com.sikiedu.web
PasteAction.java
package com.sikiedu.web;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.sikiedu.domain.Paste;
import com.sikiedu.domain.User;
import com.sikiedu.service.PasteService;
public class PasteAction extends ActionSupport implements ModelDriven<Paste>{
public Paste paste=new Paste();
public String addPaste() throws Exception {
//没有的数据手动封装
// private Integer ansnum;
paste.setAnsnum(0);
// private Integer glanceover;
paste.setGlanceover(0);
// private String createtime;
Date date=new Date(System.currentTimeMillis());
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String createtime=format.format(date);
paste.setCreatetime(createtime);
//拿到登陆的user
User user=(User) ActionContext.getContext().getSession().get("user");
paste.setUser(user);
PasteService pasteService=new PasteService();
pasteService.addPaste(paste);
return"toIndex";
}
@Override
public Paste getModel() {
// TODO Auto-generated method stub
return paste;
}
}
UserAction.java
package com.sikiedu.web;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.sikiedu.domain.User;
import com.sikiedu.service.UserService;
public class UserAction extends ActionSupport implements ModelDriven<User>{
public User user=new User();
public String login() throws Exception {
UserService userService=new UserService();
User temp=userService.findUser(user);
if(temp!=null) {
//把temp放到session域中
ActionContext.getContext().getSession().put("user", temp);
return "toIndex";
}else {
ActionContext.getContext().put("error", "用户名或密码错误");
return "login";
}
}
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
}
配置hibernate.cfg.xml和struts.xml
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatelearn?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8</property>
<property name="hibernate.connection.username">login</property>
<property name="hibernate.connection.password">123</property>
<!-- 将hibernate生成的sql语句打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化hibernate生成的sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 配置hibernate自动创建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库的隔离级别 -->
<property name="hibernate.connection.isolation">4</property>
<!-- 配置事务 session与当前线城绑定 -->
<property name="hibernate.current_session_context_class">thread</property>
<mapping resource="com/sikiedu/domain/User.hbm.xml"/>
<mapping resource="com/sikiedu/domain/Paste.hbm.xml"/>
</session-factory>
</hibernate-configuration>
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="hibernateTest" namespace="/" extends="struts-default">
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="UserAction_*" class="com.sikiedu.web.UserAction" method="{1}">
<result name="toIndex" type="redirect">/index.jsp</result>
<result name="login">/login.jsp</result>
</action>
<action name="PasteAction_*" class="com.sikiedu.web.PasteAction" method="{1}">
<result name="toIndex" type="redirect">/index.jsp</result>
</action>
</package>
</struts>
多对多案例
一个用户可以回复多个帖子,一个帖子可以有多个用户回复
业务流程
把两个多对多的关系转化为两个一对多的关系
在hibernatelearn数据库中创建answer表
在WebContent下创建detail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>问题详情</title>
<meta name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="keywords" content="fly,layui,前端社区">
<meta name="description" content="">
<link rel="stylesheet" href="res/layui/css/layui.css">
<link rel="stylesheet" href="res/css/global.css">
<script src="res/layui/layui.js"></script>
<script src="js/jquery.js"></script>
<style type="text/css" rel="stylesheet">
form {
margin: 0;
}
.editor {
margin-top: 5px;
margin-bottom: 5px;
}
</style>
</head>
<body>
<iframe src="head.html" scrolling="no" width="100%" height="65px"></iframe>
<div class="main layui-clear">
<div class="wrap">
<div class="content detail">
<div class="fly-panel detail-box">
<h1>帖子标题</h1>
<div class="fly-tip fly-detail-hint" data-id="">
<span class="fly-tip-stick">置顶帖</span><span class="jie-admin">
<a href="">点击置顶</a>
</span> <span class="layui-btn layui-btn-mini jie-admin"> <a
href="">取消置顶</a>
</span> <span class="jie-admin" type="del" style="margin-left: 20px;">
<a>删除该帖</a>
</span> </span>
<div class="fly-list-hint">
<i class="iconfont" title="回答"></i> 2
</div>
</div>
<div class="detail-about">
<a class="jie-user" href=""> <img src="res/images/uer.jpg"
alt="头像"> <cite> 压缩 <em>2017-05-01发布</em>
</cite>
</a>
<div class="detail-hits" data-id="{{rows.id}}">
<span class="layui-btn layui-btn-mini jie-admin"><a
href="#">已完帖,无法编辑</a> </span> <span
class="layui-btn layui-btn-mini jie-admin" type="collect"
data-type="add"> <a id="collectPost">收藏</a>
</span> <span
class="layui-btn layui-btn-mini jie-admin layui-btn-danger"
type="collect" data-type="add"> <a>取消收藏</a>
</span>
</div>
</div>
<div class="detail-body photos" style="margin-bottom: 20px;">
<p>帖子内容</p>
</div>
</div>
<div class="fly-panel detail-box" style="padding-top: 0;">
<a name="comment"></a>
<ul class="jieda photos" id="jieda">
<li data-id="12" class="jieda-daan"><a
name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg"
alt=""> <cite> <i>纸飞机</i> <!-- <em>(楼主)</em>
<em style="color:#5FB878">(管理员)</em> -->
</cite>
</a>
<div class="detail-hits">
<span>3分钟前</span>
</div>
<i class="iconfont icon-caina" title="最佳答案"></i>
</div>
<div class="detail-body jieda-body">
<p>么么哒</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan zanok" type="zan"><i
class="iconfont icon-zan"></i><em>12</em> </span>
<!-- <div class="jieda-admin">
<span type="del">删除</span>
<span class="jieda-accept" type="accept">采纳</span>
</div> -->
</div></li>
<li data-id="13"><a name="item-121212121212"></a>
<div class="detail-about detail-about-reply">
<a class="jie-user" href=""> <img src="res/images/uer.jpg"
alt=""> <cite> <i>香菇</i> <em
style="color: #FF9E3F">活雷锋</em>
</cite>
</a>
<div class="detail-hits">
<span>刚刚</span>
</div>
</div>
<div class="detail-body jieda-body">
<p>蓝瘦</p>
</div>
<div class="jieda-reply">
<span class="jieda-zan" type="zan"><i
class="iconfont icon-zan"></i><em>0</em> </span>
<div class="jieda-admin">
<span type="del"><a href="#"
class="layui-btn layui-btn-danger layui-btn-small">删除</a></span> <span
class="jieda-accept" type="accept"> <a href="#"
class="layui-btn layui-btn-small">采纳</a></span>
</div>
</div></li>
<!-- <li class="fly-none">没有任何回答</li> -->
</ul>
<spanid="toName">@ 压缩(楼主)</span>
<div class="layui-form layui-form-pane">
<form
action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
<input type="hiddern" name="pasteid"
value="40286f81726fa53c01726fa675730000" />
<div class="layui-form-item layui-form-text">
<div class="layui-input-block">
<div class="editor">
<textarea id="content" name="content"
style="width: 690px; height: 450px; visibility: hidden;"></textarea>
</div>
</div>
</div>
<div class="layui-form-item">
<button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="edge">
<dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">最近热帖</dt>
<dd>
<a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i
class="iconfont"></i> 6087</span>
</dd>
<dd>
<a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i>
767</span>
</dd>
<dd>
<a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i
class="iconfont"></i> 6087</span>
</dd>
<dd>
<a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i>
767</span>
</dd>
</dl>
<dl class="fly-panel fly-list-one">
<dt class="fly-panel-title">近期热议</dt>
<dd>
<a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
class="iconfont"></i> 96</span>
</dd>
</dl>
</div>
</div>
<script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
<script type="text/javascript">
KE.show({
id : 'content',
resizeMode : 1,
cssPath : './index.css',
items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
'italic', 'underline', 'removeformat', 'justifyleft',
'justifycenter', 'justifyright', 'insertorderedlist',
'insertunorderedlist', 'emoticons', 'image', 'link' ]
});
</script>
</body>
</html>
在com.sikiedu.domain下添加Answer.java和Answer.hbm.xml以及改变其余两个类和配置文件的代码
Answer.java
package com.sikiedu.domain;
public class Answer {
private String id;
private String content;
private User user;
private Paste paste;
//此处省略get和set方法以及构造器
}
Answer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.sikiedu.domain">
<class name="Answer" table="answer">
<id name="id">
<generator class="uuid"></generator>
</id>
<property name="content" column="content"></property>
<!-- 对应User表的userid 和Paste表中的pasteid-->
<many-to-one name="user" column="userid" class="User"></many-to-one>
<many-to-one name="paste" column="pasteid" class="Paste"></many-to-one>
</class>
</hibernate-mapping>
在Paste.java中添加一私有属性userAnswerSet和get/set方法
package com.sikiedu.domain;
import java.util.HashSet;
import java.util.Set;
public class Paste {
private String id;
private String title;
private String content;
private Integer offer;
private Integer ansnum;
private Integer glanceover;
private String createtime;
//hibernate不需要获取userid 直接获取到user即可 一个帖子属于一个用户
private User user;
//这个帖子 回复的所有用户
private Set<User> userAnswerSet=new HashSet<User>();
public Set<User> getUserAnswerSet() {
return userAnswerSet;
}
public void setUserAnswerSet(Set<User> userAnswerSet) {
this.userAnswerSet = userAnswerSet;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Paste() {
super();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Integer getOffer() {
return offer;
}
public void setOffer(Integer offer) {
this.offer = offer;
}
public Integer getAnsnum() {
return ansnum;
}
public void setAnsnum(Integer ansnum) {
this.ansnum = ansnum;
}
public Integer getGlanceover() {
return glanceover;
}
public void setGlanceover(Integer glanceover) {
this.glanceover = glanceover;
}
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
public Paste(String id, String title, String content, Integer offer, Integer ansnum, Integer glanceover,
String createtime) {
super();
this.id = id;
this.title = title;
this.content = content;
this.offer = offer;
this.ansnum = ansnum;
this.glanceover = glanceover;
this.createtime = createtime;
}
}
在Paste.hbm.xml加上响应配置信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.sikiedu.domain">
<class name="Paste" table="paste">
<id name="id">
<generator class="uuid"></generator>
</id> <!-- 主键用id表示 -->
<property name="title" column="title"></property>
<property name="content" column="content"></property>
<property name="offer" column="offer"></property>
<property name="ansnum" column="ansnum"></property>
<property name="glanceover" column="glanceover"></property>
<property name="createtime" column="createtime"></property>
<!-- 多对一的配置 外键用many-to-one 或者one-to-many-->
<many-to-one name="user" class="User" column="userid" insert="true"></many-to-one>
<!-- 多对多的关系 转换为两个一对多 -->
<set name="userAnswerSet">
<!-- 指定关联的外键的列名 -->
<key column="userid"></key>
<!-- 指定关联的外键的实体类名 -->
<one-to-many class="Answer"/>
</set>
</class>
</hibernate-mapping>
在User.java中添加一私有属性answerPasteSet和get/set方法
package com.sikiedu.domain;
import java.util.HashSet;
import java.util.Set;
public class User {
private String id;
private String username;
private String password;
private String name;
private String email;
private String telephone;
//一个用户可以对应多个表 用set 里面的键不能重复
private Set<Paste> pasteSet =new HashSet<Paste>();
//一个用户回复了多个帖子
private Set<Paste> answerPasteSet=new HashSet<Paste>();
public Set<Paste> getAnswerPasteSet() {
return answerPasteSet;
}
public void setAnswerPasteSet(Set<Paste> answerPasteSet) {
this.answerPasteSet = answerPasteSet;
}
public Set<Paste> getPasteSet() {
return pasteSet;
}
public void setPasteSet(Set<Paste> pasteSet) {
this.pasteSet = pasteSet;
}
public User() {
super();
}
public String getName() {
return name;
}
public User(String id, String username, String password, String name, String email, String telephone) {
super();
this.id = id;
this.username = username;
this.password = password;
this.name = name;
this.email = email;
this.telephone = telephone;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
在User.hbm.xml加上响应配置信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.sikiedu.domain">
<class name="User" table="user">
<id name="id">
<generator class="uuid"></generator>
</id>
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="name" column="name"></property>
<property name="email" column="email"></property>
<property name="telephone" column="telephone"></property>
<set name="pasteSet" cascade="" inverse="false">
<key column="userid"></key>
<one-to-many class="Paste" />
</set>
<!-- 多对多的关系 转换为两个一对多 -->
<set name="answerPasteSet">
<!-- 指定关联的外键的列名 -->
<key column="pasteid"></key>
<!-- 指定关联的外键的实体类名 -->
<one-to-many class="Answer" />
</set>
</class>
</hibernate-mapping>
在com.sikiedu.dao下添加AnswerDao.java
package com.sikiedu.dao;
import org.hibernate.Session;
import com.sikiedu.domain.Answer;
import com.sikiedu.utils.HibernateUtils;
public class AnswerDao {
public void addAnswer(Answer answer) {
Session session = HibernateUtils.getCurrentSession();
session.save(answer);
}
}
在com.sikiedu.service下添加AnswerService.java
package com.sikiedu.service;
import org.hibernate.Transaction;
import com.sikiedu.dao.AnswerDao;
import com.sikiedu.domain.Answer;
import com.sikiedu.utils.HibernateUtils;
public class AnswerService {
public void addAnswer(Answer answer) {
AnswerDao answerDao=new AnswerDao();
Transaction beginTransaction = HibernateUtils.getCurrentSession().beginTransaction();
try {
answerDao.addAnswer(answer);
} catch (Exception e) {
beginTransaction.rollback();
}
beginTransaction.commit();
}
}
在com.sikiedu.web下添加AnswerAction.java
package com.sikiedu.web;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.sikiedu.domain.Answer;
import com.sikiedu.domain.Paste;
import com.sikiedu.domain.User;
import com.sikiedu.service.AnswerService;
import com.sikiedu.service.PasteService;
public class AnswerAction extends ActionSupport implements ModelDriven<Answer> {
public Answer answer = new Answer();
public String pasteid;
public String getPasteid() {
return pasteid;
}
public void setPasteid(String pasteid) {
this.pasteid = pasteid;
}
public String addAnswer() throws Exception {
AnswerService answerService = new AnswerService();
PasteService pasteService=new PasteService();
Paste paste=pasteService.findPasteById(pasteid);
answer.setPaste(paste);
User user = (User) ActionContext.getContext().getSession().get("user");
answer.setUser(user);
System.out.println(pasteid+"---"+answer.getContent());
answerService.addAnswer(answer);
return "success";
}
@Override
public Answer getModel() {
// TODO Auto-generated method stub
return answer;
}
}
在hibernate.cfg.xml添加Answer.hbm.xml的配置信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatelearn?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8</property>
<property name="hibernate.connection.username">login</property>
<property name="hibernate.connection.password">123</property>
<!-- 将hibernate生成的sql语句打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化hibernate生成的sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 配置hibernate自动创建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库的隔离级别 -->
<property name="hibernate.connection.isolation">4</property>
<!-- 配置事务 session与当前线城绑定 -->
<property name="hibernate.current_session_context_class">thread</property>
<mapping resource="com/sikiedu/domain/User.hbm.xml"/>
<mapping resource="com/sikiedu/domain/Paste.hbm.xml"/>
<mapping resource="com/sikiedu/domain/Answer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
在struts.xml中添加AnswerAction的配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="hibernateTest" namespace="/" extends="struts-default">
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="UserAction_*" class="com.sikiedu.web.UserAction" method="{1}">
<result name="toIndex" type="redirect">/index.jsp</result>
<result name="login">/login.jsp</result>
</action>
<action name="PasteAction_*" class="com.sikiedu.web.PasteAction" method="{1}">
<result name="toIndex" type="redirect">/index.jsp</result>
</action>
<action name="AnswerAction_*" class="com.sikiedu.web.AnswerAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>