hibernate映射-基于主键映射的1-1关联关系

(学习记录,错误不足之处,请您耐心指正^_^)

hibernate映射-基于主键映射的1-1关联关系

基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据对方的主键来生成自己的主键,自己并不独立生成主键。

一、代码示例:

{类文件↓}

Manager.class

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

Manager.class

Department.class

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

Department.class

{映射文件↓}

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 2015-11-30 14:30:53 by Hibernate Tools 3.4.0.CR1 -->
 5 <hibernate-mapping package="com.zit.hibernate.one2one.primary">
 6     <class name="Manager" table="MANAGERS_2">
 7         <id name="mgrId" type="java.lang.Integer">
 8             <column name="MGR_ID" />
 9             <generator class="native" />
10         </id>
11         <property name="mgrName" type="java.lang.String">
12             <column name="MGR_NAME" />
13         </property>
14
15         <!-- 映射1-1的关联关系 :在对应是数据表中已经有外键了,使用one-to-one 进行映射-->
16         <one-to-one name="dept" class="Department"
17             >
18         </one-to-one>
19
20
21     </class>
22 </hibernate-mapping>

Manager.hbm.xml

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 2015-11-30 14:30:53 by Hibernate Tools 3.4.0.CR1 -->
 5 <hibernate-mapping package="com.zit.hibernate.one2one.primary">
 6     <class name="Department" table="DEPARTMENTS_2">
 7         <id name="deptId" type="java.lang.Integer">
 8             <column name="DEPT_ID" />
 9             <generator class="foreign">
10                 <param name="property">mgr</param>
11             </generator>
12         </id>
13         <property name="deptName" type="java.lang.String">
14             <column name="DEPT_NAME" />
15         </property>
16
17         <one-to-one name="mgr" class="Manager"
18             constrained="true">
19         </one-to-one>
20
21
22     </class>
23 </hibernate-mapping>

Department.hbm.xml

注意:在指定了foreign为主键生成策略的映射文件中,one-to-one属性一定要增加 constrained="true"属性,不然两张表之间不会有外键关联。

增加 constrained="true",以使当前主键上添加外键约束

而主键生成器的配置中,<param name="property">mgr</param>   这里mgr为当前持久化类关联的另一个持久化类的属性名。指定当前持久化类的哪一个属性的主键作为外键。

二、使用注意:

1.保存数据时,无论先save(manager),还是先save(department),hibernate都会先插入manager,再插入department,

因为 department表是以manager表的主键为自己的主键,若manager表中没有对应记录的主键,则department自己也无法插入数据。

都不会有多余的UPDATE语句。

2.查询时,若先查询manager,会用左外连接一并查出关联的department;

但是在查询条件中:on manager0_.MGR_ID=department1_.DEPT_ID   这里这个条件就是正确的,因为两个表中相关联的两个记录主键永远相同。

若先查询department,会用懒加载。

(学习记录,错误不足之处,请您耐心指正^_^)

时间: 2024-10-18 23:16:31

hibernate映射-基于主键映射的1-1关联关系的相关文章

hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化类的主键生成主键的实体的映射文件 首先需要指定主键生成方式为foreigner 格式为: <id name="departmentId" type="java.lang.Integer"> <column name="department_i

hibernate笔记--基于主键的单(双)向的一对一映射关系

上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这个外键列,而与idCard表共用一个主键,或者说是其外键为主键的表结构,这种基于主键的双向一对一映射关系应该这样配置: 新建一个IdCard实体类: public class IdCard { private int id; private String code; private Person p

Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)

Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessionFactory; static{ //获取配置信息 hibernate.cfg.xml Configuration configuration = new Configuration().configure(); //创建一个 ServiceRegistry的实例 //首先获得其标准建造器,此处用

Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信息的外键,这里先做外键. 创建User.java: 用户和身份证一对一的关联关系映射       private IdCart idCart; IdCart.java: 身份证和用户,一对一的关系       private User user; 1 package com.bie.bean; 2

hibernate 注解 联合主键映射

联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将 该类注解为@Embeddable,最后在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用,并生成set和get方法,并将该引用注 解为@Id 第二.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,最后 在主类中(该

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

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

Hibernate(八):基于外键映射的1-1关联关系

背景: 一个部门只有一个一把手,这在程序开发中就会设计数据映射应该设置为一对一关联. 在hibernate代码开发中,实现这个业务有两种方案: 1)基于外键映射的1-1关联: 2)基于主键映射的1-1关联. 本篇文章主要是用来学习如何使用外键实现1-1关联关系. 新建项目hibernate05 新建java project,引入依赖包,在src下添加hibernate.cfg.xml 1 <?xml version="1.0" encoding="UTF-8"

【Hibernate步步为营】--复合主键映射具体解释

上篇文章讨论了继承映射,它是对象模型中最主要的特性,对于继承映射它的主要区分是字段类型的不同,所以在生成表结构时须要有新列来标识数据的类型,能够使用<subclass>标签并在标签中加入discriminator-value鉴别器.该篇文章来讨论复合主键映射,它是指主键是多列的组合,如今在设计数据库时非常少用到复合主键,由于考虑到数据库的优化,经常会把复合主键拆分到两个表中,并利用一个关系表来维护两个表的关系,关系表中不加入主键. 一.复合主键映射 复合主键映射须要在映射配置文件里使用<

hibernate 复合主键映射

第一次写博客,只想把工作中遇到的问题记下来. 最近做了一个二次开发的改造,改完之后被告知数据表主键根据需求需要用复合主键,因为本人菜鸟一枚,复合主键从未用过,只能靠度娘 网上给出的复合主键映射大致就两种 第一种:将复合主键对应的属性与实体其他普通属性放在一起 /*实体类.复合主键必须实现Serialzable接口*/ public class User implements Serialzable { private static final long serialVersionUID=1L;/