首页 > 代码库 > [原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现

[原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.基于主键映射的 1-1  

  1)基于主键的映射策略:指一端的主键生成器使用 foreign 策略,表明根据”对方”的主键来生成自己的主键,自己并不能独立生成主键. <param> 子元素指定使用当前持久化类的哪个属性作为 “对方

    

 1 <hibernate-mapping package="com.jason.hibernate.entities.primary.one2one"> 2  3     <class name="Department" table="DEPARTMENT"> 4      5         <id name="deptId" type="java.lang.Integer"> 6             <column name="DEPT_ID" /> 7             <generator class="foreign"> 8                 <param name="property">mgr</param> 9             </generator>10         </id>11         12         <property name="deptName" type="java.lang.String">13             <column name="DEPT_NAME" />14         </property>15         16         17         <one-to-one name="mgr" class="Manager" constrained="true"></one-to-one>18        19         20     </class>21     22 </hibernate-mapping>

 

 

 

  

  2)采用foreign主键生成器策略的一端增加 one-to-one 元素映射关联属性,其one-to-one属性还应增加 constrained=“true” 属性;另一端增加one-to-one元素映射关联属性。

  

 1 <hibernate-mapping package="com.jason.hibernate.entities.primary.one2one"> 2     <class name="Manager" table="MANAGER"> 3      4         <id name="mgrId" type="java.lang.Integer"> 5             <column name="MGR_ID" /> 6             <generator class="native" /> 7         </id> 8          9         <property name="mgrName" type="java.lang.String">10             <column name="MGR_NAME" />11         </property>12         13         <one-to-one name="dept" class="Department"></one-to-one>14        15     </class>16     17 </hibernate-mapping>

 

 

  3)constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象(“对方”)所对应的数据库表主键

 

2.代码

技术分享

 

 

Department

 1 package com.jason.hibernate.entities.foreign.one2one; 2  3 public class Department { 4     private Integer deptId; 5     private String deptName; 6  7     private Manager mgr; 8  9     public Integer getDeptId() {10         return deptId;11     }12 13     public void setDeptId(Integer deptId) {14         this.deptId = deptId;15     }16 17     public String getDeptName() {18         return deptName;19     }20 21     public void setDeptName(String deptName) {22         this.deptName = deptName;23     }24 25     public Manager getMgr() {26         return mgr;27     }28 29     public void setMgr(Manager mgr) {30         this.mgr = mgr;31     }32 33 }

 

 

Manager

 1 package com.jason.hibernate.entities.foreign.one2one; 2  3 public class Manager { 4  5     private Integer mgrId; 6     private String mgrName; 7     private Department dept; 8  9     public Integer getMgrId() {10         return mgrId;11     }12 13     public void setMgrId(Integer mgrId) {14         this.mgrId = mgrId;15     }16 17     public String getMgrName() {18         return mgrName;19     }20 21     public void setMgrName(String mgrName) {22         this.mgrName = mgrName;23     }24 25     public Department getDept() {26         return dept;27     }28 29     public void setDept(Department dept) {30         this.dept = dept;31     }32 33 }

 

 

Department.hbm.xml

 1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2016-10-5 22:31:35 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping package="com.jason.hibernate.entities.primary.one2one"> 6  7     <class name="Department" table="DEPARTMENT"> 8      9         <id name="deptId" type="java.lang.Integer">10             <column name="DEPT_ID" />11             <generator class="foreign">12                 <param name="property">mgr</param>13             </generator>14         </id>15         16         <property name="deptName" type="java.lang.String">17             <column name="DEPT_NAME" />18         </property>19         20         21         <one-to-one name="mgr" class="Manager" constrained="true"></one-to-one>22        23         24     </class>25     26 </hibernate-mapping>

 

 

Manager.hbm.xml

 1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2016-10-5 22:31:35 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping package="com.jason.hibernate.entities.primary.one2one"> 6     <class name="Manager" table="MANAGER"> 7      8         <id name="mgrId" type="java.lang.Integer"> 9             <column name="MGR_ID" />10             <generator class="native" />11         </id>12         13         <property name="mgrName" type="java.lang.String">14             <column name="MGR_NAME" />15         </property>16         17         <one-to-one name="dept" class="Department"></one-to-one>18        19     </class>20     21 </hibernate-mapping>

 

 

 

 

hibernate.cfg.xml

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6     <session-factory> 7         <!-- hibernate 连接数据库的基本信息 --> 8         <property name="connection.username">root</property> 9         <property name="connection.password">zhangzhen</property>10         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>11         <property name="connection.url">jdbc:mysql:///hibernate</property>12         13         14         <!-- 配置hibernate 的节本信息 -->15         <!-- hibernate 所使用的数据库方言 -->16         <!--<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>-->17    <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 18         <!-- 执行操作时是否在控制台打印SQL  -->19         <property name="show_sql">true</property>20         21         <!-- 是否都SQL 进行格式化 -->22         <property name="format_sql">true</property>23         24         25         <!-- 指定自动生成数据表的策略 -->26         <property name="hbm2ddl.auto">update</property>27         28         <!-- 设置hibernate 的事务隔离级别 -->29         <property name="connection.isolation">2</property>30         31         32         <!-- 配置c3p0 -->33         <property name="hibernate.c3p0.max_size">10</property>34         <property name="hibernate.c3p0.min_size">5</property>35         <property name="c3p0.acquire_increment">2</property>36         <property name="c3p0.idle_test_period">2000</property>37         <property name="c3p0.timeout">2000</property>38         <property name="c3p0.max_statements">10</property>39         40         41         <!-- 对于mysql 无效,对于oracle 有效 -->42         <!-- 设定JDBC 的Statement 读取数据的时候每次从数据库中取出的记录的条数 -->43         <property name="hibernate.jdbc.fetch_size">100</property>44         45         <!-- 设置数据库进行批量删除,批量更新和批量插入的时候的大小 -->46         <property name="hibernate.jdbc.batch_size">30</property>47         48         <!-- 指定关联的 .hbm.xml 文件 -->49         <!-- 50             <mapping resource="hibernate/helloworld/News.hbm.xml"/>51             <mapping resource="hibernate/helloworld/Worker.hbm.xml"/>52         53             <mapping resource="com/jason/hibernate/entities/n21/Customer.hbm.xml"/>54             <mapping resource="com/jason/hibernate/entities/n21/Order.hbm.xml"/>55         -->56         57          <mapping resource="com/jason/hibernate/entities/n21/both/Customer.hbm.xml"/>       58          <mapping resource="com/jason/hibernate/entities/n21/both/Order.hbm.xml"/>       59         60         61         <!-- 1-1 映射 -->62         <!-- 基于外键实现 -->63         <!-- <mapping resource="com/jason/hibernate/entities/foreign/one2one/Manager.hbm.xml"/>64         <mapping resource="com/jason/hibernate/entities/foreign/one2one/Department.hbm.xml"/>65          -->66         <!-- 基于主键实现 -->67         <mapping resource="com/jason/hibernate/entities/primary/one2one/Manager.hbm.xml"/>68         <mapping resource="com/jason/hibernate/entities/primary/one2one/Department.hbm.xml"/>69         70         71     </session-factory>72     73 </hibernate-configuration>

 

 

 

HibernateTest.java

  1 package com.jason.hibernate.entities.foreign.one2one;  2   3 import hibernate.helloworld.News;  4   5 import java.util.Date;  6   7 import org.hibernate.Hibernate;  8 import org.hibernate.Session;  9 import org.hibernate.SessionFactory; 10 import org.hibernate.Transaction; 11 import org.hibernate.cfg.Configuration; 12 import org.hibernate.service.ServiceRegistry; 13 import org.hibernate.service.ServiceRegistryBuilder; 14 import org.junit.After; 15 import org.junit.Before; 16 import org.junit.Test; 17  18 public class HibernateTest { 19  20     private SessionFactory sessionFactory; 21     private Session session; 22     private Transaction transaction; 23     @Test 24     public void test() { 25  26         // 1. 创建一个SessionFatory 对象 27         SessionFactory sessionFactory = null; 28  29         // 1) 创建Configuration 对象:对应hibernate 的基本配置信息 和 对象关系映射信息 30         Configuration configuration = new Configuration().configure(); 31  32         // 2) 创建一个ServiceRegistry 对象:hibernate 4.x 新天添加的对象。 33         // hibernate 的任何配置 和 服务都需要在该对象中注册后才有效 34         ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() 35                 .applySettings(configuration.getProperties()) 36                 .buildServiceRegistry(); 37  38         // sessionFactory = configuration.buildSessionFactory(); 39         sessionFactory = configuration.buildSessionFactory(serviceRegistry); 40  41         // 2. 创建一个session 对象 42         Session session = sessionFactory.openSession(); 43  44         // 3. 开启事物 45         Transaction transaction = session.beginTransaction(); 46  47         // 4.执行保存操作 48         News news = new News("java", "jason", new Date( 49                 new java.util.Date().getTime())); 50         session.save(news); 51  52         // 5.提交事物 53         transaction.commit(); 54         // 6.关闭session 55         session.close(); 56         // 7.关闭SessionFactory 对象 57         sessionFactory.close(); 58     } 59  60     // 创建上述三个对象 61     @Before 62     public void init() { 63         Configuration configuration = new Configuration().configure(); 64         ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() 65                 .applySettings(configuration.getProperties()) 66                 .buildServiceRegistry(); 67  68         sessionFactory = configuration.buildSessionFactory(serviceRegistry); 69  70         session = sessionFactory.openSession(); 71  72         transaction = session.beginTransaction(); 73     } 74  75     // 关闭上述三个对象 76     @After 77     public void destroy() { 78         transaction.commit(); 79         session.close(); 80         sessionFactory.close(); 81     } 82  83      84     @Test 85     public void testSave(){ 86          87         Department department = new Department(); 88         department.setDeptName("DEPT-BB"); 89          90         Manager manager = new Manager(); 91         manager.setMgrName("MGR-BB"); 92          93          94         //设定关联关系 95         department.setMgr(manager); 96         manager.setDept(department); 97          98         //保存 99         //建议先保存没有外键列的那个对象,这样会减少update 语句100         session.save(manager);101         session.save(department);102         103         104     }105     106     @Test107     public void testGet(){108         109         //1.默认情况下对关联属性使用懒加载110         Department dept = (Department) session.get(Department.class, 1);111         System.out.println(dept.getDeptName());112         113         114         //2.查询Manager 对象的连接条件应该是dept.manager_id = mgr.manager_id115         //而不因该是  manager0_.MGR_ID=department1_.DEPT_ID 116         Manager mgr = dept.getMgr();117         System.out.println(mgr);118     }119     120     121     @Test122     public void testGet2(){123         124         //在查询没有外键的实体对象,使用的是左外连接查询,一并查询出其关联的对象,并已经进行初始化125         Manager manager = (Manager) session.get(Manager.class, 1);126         System.out.println(manager);127         128         System.out.println(manager.getDept().getDeptName());129         130     }131     132     133     134     135 }

 

[原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现