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

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

1.前端部分

我们的思路是这样的:做一个登录页面(login.jsp),登录之后点击“朋友信息”(已登录页面main.jsp),就可以进入朋友信息页面进行数据修改(friend.jsp)。

1.login.jsp

     
     
     
     
  1. action="#" method="post">
  2. colspan="2"> type="submit" value="注册"/>
  3. 用户名: type="text"/>
    密码: type="password"/>

2.main.jsp

     
     
     
     
  1. 主页面


  2. href="${pageContext.request.contextPath}/login.jsp">登录
  3. href="${pageContext.request.contextPath}/friend.jsp">朋友页面

3.friend.jsp

     
     
     
     
  1. action="#" method="post">
  2. colspan="2"> type="submit" value="提交"/>
  3. 姓名: type="text"/>
    电话: type="text"/>

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. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  3. "http://struts.apache.org/dtds/struts-2.3.dtd">
  4. name="struts.devMode" value="true" />
  5. name="all" namespace="/" extends="struts-default">
  6. name="main" >/main.jsp
  7. file="user.xml">
file = "user.xml" >表示引入user.xml文件,这样做的好处就是便于分工开发。
配置user.xml文件内容
     
     
     
     
  1. xml version="1.0" encoding="UTF-8" ?>
  2. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  3. "http://struts.apache.org/dtds/struts-2.3.dtd">
  4. name="user" namespace="/user" extends="all">
  5. name="*" class="action.UserAction" method="{1}">
这里指到了 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. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  2. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  3. name="hibernate.connection.driver_class">com.mysql.jdbc.Driver
  4. name="hibernate.connection.url">jdbc:mysql://localhost:3306/foreignTest
  5. name="hibernate.connection.username">root
  6. name="hibernate.connection.password">123456
  7. name="hibernate.dialect">org.hibernate.dialect.MySQLDialect
  8. name="hibernate.show_sql">true
  9. name="hbm2ddl.auto">update
  10. class="model.User"/>
这里指明hibernate的映射类为 model.User
name = "hbm2ddl.auto" > update 可以在数据库的表不存在的时候自己新建一个表
接下来用hibernate注解的方式,注明表的所在,id值(并且设置为自动增长)
Hibernate表中外键使用(个人笔记)_第1张图片
 (如果还没有往lib中导入jar包需要导入,否则会报错,还要web.xml也需要新建了)
编写测试语句,点击表格提交,观察控制台打印
Hibernate表中外键使用(个人笔记)_第2张图片
要编写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. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  3. "http://struts.apache.org/dtds/struts-2.3.dtd">
  4. name="friend" namespace="/friend" extends="all">
  5. name="*" class="action.FriendAction" method="{1}">

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方法。 除了声明属性,还有注解指向另一个表的外键。
Hibernate表中外键使用(个人笔记)_第3张图片
@OneToOne
@JoinColumn(name="cid",unique=true)
一对一映射,设置为目前这个表的外键,表中的名称为“cid”,设置唯一性约束。
而在Friend类中添加的注解为@OneToOne(mappedBy="Friend",表示映射到Friend这个外键上。
Hibernate表中外键使用(个人笔记)_第4张图片
 到这里映射已经配置好了,下面要测试映射的效果。
在FriendAction中添加一下语句
Hibernate表中外键使用(个人笔记)_第5张图片

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

    
    
    
    
 这样当我们填好朋友的信息后返回到首页,它就会通过USER的session把friend的name属性提出来。
Hibernate表中外键使用(个人笔记)_第7张图片
(当我们把login页面的提交做成检查用户存在,登录功能,它就会在登录后获取到session,直接就能在main页面显示出对应朋友的姓名)

你可能感兴趣的:(Hibernate表中外键使用(个人笔记))