struts+hibernate的多对一和一对多案例

一对多案例

一个用户可以发布多个帖子

项目流程:从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">
			已有账号,立即&nbsp;<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">
		已有账号,立即&nbsp;<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">
			已有账号,立即&nbsp;<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&amp;characterEncoding=utf-8&amp;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="回答">&#xe60c;</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">&#xe60b;</i> 6087</span>
				</dd>
				<dd>
					<a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont">&#xe60b;</i>
						767</span>
				</dd>
				<dd>
					<a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i
						class="iconfont">&#xe60b;</i> 6087</span>
				</dd>
				<dd>
					<a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont">&#xe60b;</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">&#xe60c;</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&amp;characterEncoding=utf-8&amp;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>

最后数据库answer中显示信息

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值