Hibernate表中外键使用(个人笔记)

(由于这篇文章写得杂乱无章,随便参考即可,不建议照做,仅作为本人日常记录)

1.前端部分

我们的思路是这样的:做一个登录页面(login.jsp),登录之后点击“朋友信息”(已登录页面main.jsp),就可以进入朋友信息页面进行数据修改(friend.jsp)。
1.login.jsp
   
   
  1. <form action="#" method="post">
  2. <table>
  3. <tr><td>用户名:</td><td><input type="text"/></td></tr>
  4. <tr><td>密码:</td><td><input type="password"/></td></tr>
  5. <tr><td colspan="2"><input type="submit" value="注册"/></td></tr>
  6. </table>
  7. </form>
2.main.jsp
   
   
  1. <body>
  2. 主页面
  3. <br/>
  4. <br/>
  5. <a href="${pageContext.request.contextPath}/login.jsp">登录</a>
  6. <a href="${pageContext.request.contextPath}/friend.jsp">朋友页面</a>
  7. </body>
3.friend.jsp
   
   
  1. <form action="#" method="post">
  2. <table>
  3. <tr><td>姓名:</td><td><input type="text"/></td></tr>
  4. <tr><td>电话:</td><td><input type="text"/></td></tr>
  5. <tr><td colspan="2"><input type="submit" value="提交"/></td></tr>
  6. </table>
  7. </form>

2.login提交信息的实现

要把login.jsp中的表格内容提交,需要设置标签的name,name的构成是  对象.属性  ,既然要用到对象,那么就需要新建javabean(包为model,名为User.java),设置setter&getter方法
   
   
  1. package model;
  2. public class User {
  3. private int id; //id
  4. private String name; //用户名
  5. private String pwd; //用户密码
  6. public int getId() {
  7. return id;
  8. }
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public String getPwd() {
  19. return pwd;
  20. }
  21. public void setPwd(String pwd) {
  22. this.pwd = pwd;
  23. }
  24. }
这里用的是struts2框架,环境配置方面在前面《struts2的环境配置与简单登录功能实现》有提到,就不再赘述了。
这里设置标签的name属性

至于这个表格要提交到什么位置呢, action="${pageContext.request.contextPath}/user/check" 我们这里把它提交到user下的check
 /user/check怎么定位呢,首先需要配置struts.xml
   
   
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5. <struts>
  6. <constant name="struts.devMode" value="true" />
  7. <package name="all" namespace="/" extends="struts-default">
  8. <global-results>
  9. <result name="main" >/main.jsp</result>
  10. </global-results>
  11. </package>
  12. <include file="user.xml"></include>
  13. </struts>
<include file = "user.xml" ></include>表示引入user.xml文件,这样做的好处就是便于分工开发。
配置user.xml文件内容
   
   
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5. <struts>
  6. <package name="user" namespace="/user" extends="all">
  7. <action name="*" class="action.UserAction" method="{1}">
  8. </action>
  9. </package>
  10. </struts>
这里指到了 action.UserAction ,所以我们先把UserAction这个类写好(在action包中)
UserAction内容
   
   
  1. package model;
  2. public class UserAction {
  3. private User user;
  4. public User getUser() {
  5. return user;
  6. }
  7. public void setUser(User user) {
  8. this.user = user;
  9. }
  10. //添加用户的方法
  11. public String add(){
  12. return null;
  13. }
  14. }
把javabean类写进去,设置setter&getter方法
这里的action方法为add,但是要注意返回值得为String ,而且参数列表不可以有内容,这是硬格式。( public String 方法名 (){
   
   
  1. <!DOCTYPE hibernate-configuration PUBLIC
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  4. <hibernate-configuration>
  5. <session-factory>
  6. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  7. <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/foreignTest</property>
  8. <property name="hibernate.connection.username">root</property>
  9. <property name="hibernate.connection.password">123456</property>
  10. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  11. <property name="hibernate.show_sql">true</property>
  12. <property name="hbm2ddl.auto">update</property>
  13. <!--<mapping resource="model/Student.hbm.xml"/> 旧的映射方式-->
  14. <mapping class="model.User"/>
  15. </session-factory>
  16. </hibernate-configuration>
这里指明hibernate的映射类为 model.User
<property name = "hbm2ddl.auto" > update </property> 可以在数据库的表不存在的时候自己新建一个表
接下来用hibernate注解的方式,注明表的所在,id值(并且设置为自动增长)

 (如果还没有往lib中导入jar包需要导入,否则会报错,还要web.xml也需要新建了)
编写测试语句,点击表格提交,观察控制台打印

要编写dao类,需要先完善hibernate的工具类 :在common包下的 HibernateUtil
    
    
  1. package common;
  2. import org.hibernate.*;
  3. import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
  4. import org.hibernate.cfg.Configuration;
  5. import org.hibernate.service.ServiceRegistry;
  6. public class HibernateUtil {
  7. private static SessionFactory sessionFactory;
  8. private static SessionFactory buildSessionFactory() {
  9. try {
  10. Configuration configuration = new Configuration();
  11. configuration.configure("hibernate.cfg.xml");
  12. ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
  13. .applySettings(configuration.getProperties()).build();
  14. SessionFactory sessionFactory = configuration
  15. .buildSessionFactory(serviceRegistry);
  16. return sessionFactory;
  17. } catch (Throwable ex) {
  18. throw new ExceptionInInitializerError(ex);
  19. }
  20. }
  21. public static SessionFactory getSessionFactory() {
  22. if (sessionFactory == null)
  23. sessionFactory = buildSessionFactory();
  24. return sessionFactory;
  25. }
  26. public static Session openSession() {
  27. return getSessionFactory().openSession();
  28. }
  29. }
现在编写用来向数据库插入数据的dao类:dao包下的UserDAO
   
   
  1. package dao;
  2. import org.hibernate.Session;
  3. import org.hibernate.Transaction;
  4. import common.HibernateUtil;
  5. import model.User;
  6. public class UserDAO {
  7. Session session;
  8. //添加对象
  9. public void update(User user){
  10. session=HibernateUtil.openSession();
  11. Transaction tx=session.beginTransaction(); //开始事务,存到tx
  12. session.saveOrUpdate(user); //如果不存在就创建
  13. tx.commit(); //事务提交
  14. session.close(); //关闭session
  15. }
  16. }
session = HibernateUtil . openSession ();   首先获取session,这里的session是 用来处理连接数据库。
session . beginTransaction ();表示事务的开始 (事务可以为了保证数据 安全性,和数据库的可执行性, 可以自动控制 事务回滚,然后断开,这样子就不会影响数据,也不会锁死
session . saveOrUpdate ( user ); 对对象进行保存或者修改操作,就是把save和modify组合成一个方法,会智能识别需求使用。
dao方法编写好之后,在action中调用dao方法
   
   
  1. //添加用户的方法
  2. public String add(){
  3. System.out.println("成功进入了add方法"); //测试:成功进入action的add方法
  4. dao.update(user);
  5. ActionContext.getContext().getSession().put("USER",user);
  6. return "main";
  7. }
这里用 ActionContext . getContext (). getSession (). put ( "USER" , user );获取session,然后把user对象存进USER的session中去。
因为做了 return "main" ;跳转,所以还需要注意在struts.xml中配置跳转路径。
这个时候查看数据库,如果user表中已经有数据,说明用hibernate成功往数据库写入数据。

2.friend提交信息的实现

既然ogin.jsp已经能提交信息了,那么现在让friend.jsp也可以提交信息,做法和上面基本一致。
1.新建friend的javabean
     
     
  1. package model;
  2. import javax.persistence.Entity;
  3. import javax.persistence.GeneratedValue;
  4. import javax.persistence.Id;
  5. public class Friend {
  6. @Entity
  7. public class User {
  8. private int id; //id
  9. private String name; //用户名
  10. private String phone;
  11. @Id
  12. @GeneratedValue
  13. public int getId() {
  14. return id;
  15. }
  16. public void setId(int id) {
  17. this.id = id;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public String getPhone() {
  26. return phone;
  27. }
  28. public void setPhone(String phone) {
  29. this.phone = phone;
  30. }
  31. }
  32. }
这里把注解也给写上了,注意hinbernate也要配置 <mapping class="model.Friend"/>
2.接下来是friend.jsp页面表格提交的name属性
    
    
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>朋友信息</title>
  8. </head>
  9. <body>
  10. 登录
  11. <br/>
  12. <br/>
  13. <form action="${pageContext.request.contextPath}/friend/add" method="post">
  14. <table>
  15. <tr><td>姓名:</td><td><input type="text" name="friend.name"/></td></tr>
  16. <tr><td>电话:</td><td><input type="text" name="friend.phone"/></td></tr>
  17. <tr><td colspan="2"><input type="submit" value="提交"/></td></tr>
  18. </table>
  19. </form>
  20. <br/>
  21. <br/>
  22. <a href="${pageContext.request.contextPath}/main.jsp">返回主页</a>
  23. </body>
  24. </html>
3.编写friend.xml并且在struts.xml中引入
     
     
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5. <struts>
  6. <package name="friend" namespace="/friend" extends="all">
  7. <action name="*" class="action.FriendAction" method="{1}">
  8. </action>
  9. </package>
  10. </struts>
4.新建FriendAction
    
    
  1. package action;
  2. import com.opensymphony.xwork2.ActionContext;
  3. import model.Friend;
  4. public class FriendAction {
  5. private Friend friend;
  6. public Friend getFriend() {
  7. return friend;
  8. }
  9. public void setFriend(Friend friend) {
  10. this.friend = friend;
  11. }
  12. //添加用户的方法
  13. public String add(){
  14. System.out.println("成功进入了add方法"); //测试:成功进入action的add方法
  15. return "main";
  16. }
  17. }
5.新建FriendDAO方法
     
     
  1. package dao;
  2. import org.hibernate.Session;
  3. import org.hibernate.Transaction;
  4. import common.HibernateUtil;
  5. import model.Friend;
  6. public class FriendDAO {
  7. Session session;
  8. //添加对象
  9. public void update(Friend friend){
  10. session=HibernateUtil.openSession();
  11. Transaction tx=session.beginTransaction(); //开始事务,存到tx
  12. session.saveOrUpdate(friend); //如果不存在就创建
  13. tx.commit(); //事务提交
  14. session.close(); //关闭session
  15. }
  16. }
6.FriendAction的add方法
  
  
    
    
  1. package action;
  2. import javax.servlet.http.HttpSession;
  3. import org.apache.struts2.ServletActionContext;
  4. import com.opensymphony.xwork2.ActionContext;
  5. import dao.FriendDAO;
  6. import model.Friend;
  7. import model.Student;
  8. import model.User;
  9. public class FriendAction {
  10. private Friend friend;
  11. FriendDAO dao=new FriendDAO();
  12. public Friend getFriend() {
  13. return friend;
  14. }
  15. public void setFriend(Friend friend) {
  16. this.friend = friend;
  17. }
  18. //添加用户的方法
  19. public String add(){
  20. System.out.println("成功进入了add方法"); //测试:成功进入action的add方法
  21. dao.update(friend);
  22. HttpSession session=ServletActionContext.getRequest().getSession();
  23. User user=(User)session.getAttribute("USER");
  24. System.out.println("成功拿到session的内容:"+user.getName()); //测试:获取session的内容
  25. return "main";
  26. }
  27. }
到这里基本和前面是一样的,只是add方法多出了获取名为USER的session内容,如果控制台能打印出user的名字,说明获取成功。如果数据库Friend表成功写入数据,说明hibernate写入数据成功。
到这里两个表格写入到数据库的操作都完成了,下面要怎么把两个表格关联起来呢,这里用一对一的注解方式来编写外键映射。

3.外键关联

要关联两个类,首先在Friend类中声明User类,设置getter&setter方法,在User类中声明Friend类,设置getter&setter方法。 除了声明属性,还有注解指向另一个表的外键。
@OneToOne
@JoinColumn(name="cid",unique=true)
一对一映射,设置为目前这个表的外键,表中的名称为“cid”,设置唯一性约束。
而在Friend类中添加的注解为@OneToOne(mappedBy="Friend",表示映射到Friend这个外键上。

 到这里映射已经配置好了,下面要测试映射的效果。
在FriendAction中添加一下语句


  
  
user.setFriend(friend);  //更新session的内容
UserDAO udao=new UserDAO();
udao.update(user);  //主要是更新cid的内容,通过session来更新 这样的话session里面的USER的friend内容也更新了(通过user),而userDAO的uid本来是空的,通过update也有了数值。
现在要做的就是在首页添加一个标签,用来显示通过User获取的Friend的信息。

  
  
 这样当我们填好朋友的信息后返回到首页,它就会通过USER的session把friend的name属性提出来。
(当我们把login页面的提交做成检查用户存在,登录功能,它就会在登录后获取到session,直接就能在main页面显示出对应朋友的姓名)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值