双向和单向的区别,其实不在数据库,而在加载方向。按照我们Person和IdCard的例子,单向是Person通过拥有IdCard的实例可以加载IdCard,而双向不但Person可以加载IdCard,还使IdCard通过拥有Person实例来加载Person。数据库还是原来的数据库(两个共享主键的表),不同的是在IdCard实体类中增加Person类型的变量和在IdCard.hbm.xml中增加了对该变量的配置。
1.实体模型:
2.关系模型:
3.实体类:
IdCard.java
public class IdCard {
private Integer id;
private String cardNo;
private Person person;
//一系列的setter.getter方法
@Override
public String toString() {
return "Idcard:"+cardNo;
}
}
private Integer id;
private String cardNo;
private Person person;
//一系列的setter.getter方法
@Override
public String toString() {
return "Idcard:"+cardNo;
}
}
Person.java
public class Person {
private Integer id;
private String name;
private IdCard idCard;
//一系列的setter.getter方法
@Override
public String toString() {
// TODO Auto-generated method stub
return "Person:"+name;
}
}
private Integer id;
private String name;
private IdCard idCard;
//一系列的setter.getter方法
@Override
public String toString() {
// TODO Auto-generated method stub
return "Person:"+name;
}
}
4.映射文件:
IdCard.hbm.xml
<class name="com.sxt.hibernate.one2one.entity.IdCard" table="sxt_hibernate_idCard">
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="cardNo" length="10"></property>
<!-- one-to-one标签是为了加载 -->
<one-to-one name="person"></one-to-one>
</class>
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="cardNo" length="10"></property>
<!-- one-to-one标签是为了加载 -->
<one-to-one name="person"></one-to-one>
</class>
Person.hbm.xml
<class name="com.sxt.hibernate.one2one.entity.Person" table="sxt_hibernate_person">
<id name="id" length="4">
<!-- person的主键来源于idCard,也就是共享idCard的主键 -->
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<property name="name" length="10"></property>
<!--one-to-one标签的含义,指示Hibernate如何加载它的关联对象,默认根据主键加载。
constrained="true"的含义,表明当前主键上存在一个约束,person的主键作为外键参照了idCard,
并且要求关联属性不能为空
-->
<one-to-one name="idCard" constrained="true"></one-to-one>
</class>
<id name="id" length="4">
<!-- person的主键来源于idCard,也就是共享idCard的主键 -->
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<property name="name" length="10"></property>
<!--one-to-one标签的含义,指示Hibernate如何加载它的关联对象,默认根据主键加载。
constrained="true"的含义,表明当前主键上存在一个约束,person的主键作为外键参照了idCard,
并且要求关联属性不能为空
-->
<one-to-one name="idCard" constrained="true"></one-to-one>
</class>
5.hibernate配置文件
hibernate.cfg.xml
限于篇幅,可以参照上一篇的该文件,此处就不再赘述。
6.测试方法:
public static void main(String[] args) {
Session session = HibernateUtils.getSession();
Transaction t = session.beginTransaction();
try {
/**
* 测试插入操作
*/
/* IdCard idCard = new IdCard();
idCard.setCardNo("1234567890");
Person person = new Person();
person.setName("张三");
idCard.setPerson(person);
session.save(idCard);//这样的话,如果不在IdCard.hbm.xml的<one-to-one>中设置cascade="save-update"的话,会只保存上idCard,而保存不上关联属性person记录
//如果设置上cascade="save-update",则会先保存person记录,而由于person主键要引用idCard的id,此时idCard又没有保存呢,所以会报错org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: idCard
*/
/* IdCard idCard = new IdCard();
idCard.setCardNo("1234567890");
Person person = new Person();
person.setName("张三");
idCard.setPerson(person);
session.save(person);//这样貌似关系已经建立好了,但是在存person时,它的主键关联属性idCard的id,而此时idCard为null,所以还是会报错org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: idCard
*/
/* IdCard idCard = new IdCard();
idCard.setCardNo("1234567890");
Person person = new Person();
person.setName("张三");
person.setIdCard(idCard);
session.save(person);//这样,既建立好了关系,而且保存时还由person来维护关联关系,保存才是成功的
*/
Session session = HibernateUtils.getSession();
Transaction t = session.beginTransaction();
try {
/**
* 测试插入操作
*/
/* IdCard idCard = new IdCard();
idCard.setCardNo("1234567890");
Person person = new Person();
person.setName("张三");
idCard.setPerson(person);
session.save(idCard);//这样的话,如果不在IdCard.hbm.xml的<one-to-one>中设置cascade="save-update"的话,会只保存上idCard,而保存不上关联属性person记录
//如果设置上cascade="save-update",则会先保存person记录,而由于person主键要引用idCard的id,此时idCard又没有保存呢,所以会报错org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: idCard
*/
/* IdCard idCard = new IdCard();
idCard.setCardNo("1234567890");
Person person = new Person();
person.setName("张三");
idCard.setPerson(person);
session.save(person);//这样貌似关系已经建立好了,但是在存person时,它的主键关联属性idCard的id,而此时idCard为null,所以还是会报错org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: idCard
*/
/* IdCard idCard = new IdCard();
idCard.setCardNo("1234567890");
Person person = new Person();
person.setName("张三");
person.setIdCard(idCard);
session.save(person);//这样,既建立好了关系,而且保存时还由person来维护关联关系,保存才是成功的
*/
/**
* 小结:插入时先插主表,后插副表.必须保证主表记录已经插入了,才能为副表提供引用需要的id.
*/
/**
* 测试加载操作
*/
/* Person p=(Person)session.load(Person.class, 1);
System.out.println(p);
System.out.println(p.getIdCard());*/
IdCard idCard=(IdCard)session.get(IdCard.class, 1);
System.out.println(idCard);
System.out.println(idCard.getPerson());
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
}
本文出自 “夜狼” 博客,请务必保留此出处http://yangfei520.blog.51cto.com/1041581/273249
相关推荐
博文链接:https://shaqiang32.iteye.com/blog/201309
博文链接:https://llying.iteye.com/blog/220803
NULL 博文链接:https://lijunabc.iteye.com/blog/438426
Hibernate 一对一外键单向关联 Hibernate 一对一主键单向...Hibernate 一对一主键双向关联 Hibernate 一对一连接表双向关联 Hibernate 一对多外键双向关联 Hibernate 一对多连接表双向关联 Hibernate 多对多双向关联
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
Hibernate关联关系映射 单向关联 │ ├─ 一对一外键单向关联 │ ├─ 一对一主键单向...├─ 一对一主键双向关联 ├─ 一对一连接表双向关联 ├─ 一对多外键双向关联 ├─ 一对多连接表双向关联 └─ 多对多双向关联
010 一对一 主键关联映射_双向 011 一对一 唯一外键关联映射_单向 012 一对一 唯一外键关联映射_双向 013 session_flush 014 一对多关联映射 单向 015 一对多关联映射 双向 016 多对多关联映射 单向 017 多对多关联...
hibernate一对一主键关联映射(双向关联Person<---->IdCard) 9 hibernate一对一唯一外键关联映射(单向关联Person---->IdCard) 10 hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard) 11 session ...
1.共享主键的一对一关联映射: @Entity @Table(name="Test_Body") public class Body { private Integer id; private Heart heart; @Id public Integer getId() { return id; } public void setId(Integer id...
自己记录的学习笔记,内容很详细,有代码,包括:一对多双向关联关系、一对多双向自身关联关系、一对一关联关系(主键关联、外键关联)、一对多与一对一结合、多对多关联关系、Map、Set、List与Bag映射关系、查询...
Hibernate 实体关联关系映射 学习总结 把一对一 一对多 单向 双向 主键 外键 链接表等讲的比较清楚
JPA视频_映射双向一对一的关联关系 · 16. JPA视频_映射双向多对多的关联关系 · 17. JPA视频_二级缓存 · 18. JPA视频_JPQL_HelloWorld · 19. JPA视频_JPQL_查询缓存 · 20. JPA视频_JPQL_ORDER BY 和 GROUP...
2.3. 第二部分 - 关联映射 2.3.1. 映射Person类 2.3.2. 一个单向的Set-based关联 2.3.3. 使关联工作 2.3.4. 值类型的集合 2.3.5. 双向关联 2.3.6. 使双向关联工作 2.4. 总结 3. 体系结构(Architecture) ...
15.3 映射双向多对多关联关系 15.3.1 关联两端使用元素 15.3.2 在inverse端使用元素 15.3.3 使用组件类集合 15.3.4 把多对多关联分解为两个一对多关联 15.4 小结 15.5 思考题 第16章 Hibernate的检索...
15.3 映射双向多对多关联关系 15.3.1 关联两端使用元素 15.3.2 在inverse端使用元素 15.3.3 使用组件类集合 15.3.4 把多对多关联分解为两个一对多关联 15.4 小结 15.5 思考题 第16章 Hibernate的检索...
15.3 映射双向多对多关联关系 15.3.1 关联两端使用元素 15.3.2 在inverse端使用元素 15.3.3 使用组件类集合 15.3.4 把多对多关联分解为两个一对多关联 15.4 小结 15.5 思考题 第16章 Hibernate的检索...
15.3 映射双向多对多关联关系 15.3.1 关联两端使用元素 15.3.2 在inverse端使用元素 15.3.3 使用组件类集合 15.3.4 把多对多关联分解为两个一对多关联 15.4 小结 15.5 思考题 第16章 Hibernate的检索...
Hibernate注释大全收藏 声明实体Bean @Entity public class Flight implements Serializable { Long id; @Id public Long getId() { return id; } public void setId(Long id) { this.id...一对一 使用 @OneToOne...