[原创]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     @Test
107     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_id
115         //而不因该是  manager0_.MGR_ID=department1_.DEPT_ID
116         Manager mgr = dept.getMgr();
117         System.out.println(mgr);
118     }
119
120
121     @Test
122     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 }
时间: 2024-12-26 21:16:57

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

【web开发学习笔记】Hibernate学习总结

hibernate学习笔记 学习笔记部分: 本部分的学习比较容易,代码比较全,也容易理解,可以说是一些记忆性质的东西. 本人在学习过程中没有自己在做笔记,只是参考了网上找的学习笔记,按照那个笔记学习和复习挺快的. 源码中有一些jar包缺失,我在自学的时候也整理了相关的jar包和软件,已经上传,祝大家学习快乐. 相关资源链接: 相关的数据库连接的资源: http://download.csdn.net/detail/licong_carp/7656601 相关的jar包文件: http://dow

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

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记95:Hibernate 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Hibernate学习笔记(2)Hibernate问题

(1)数据库驱动问题 log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Exception in thread "main" org.hibernate.HibernateException: JDBC Driver class not found: com.m

【web开发学习笔记】Struts-Tags学习笔记1 - 通用标签和控制标签

通用标签和控制标签 第一部分:代码 //前端 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030" /> <title>Insert title here</title> </head> <body> 访问属性 <a href="<%=contextP

【web开发学习笔记】ibatis学习总结

ibatis学习总结 ibatis数据库配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <