一对唯一外键关联映射是采用多对一关联映射方法来解决一对一的问题,它就是多对一的一个特例。
它是基于这样一种思想:在映射多的一端时采用<many-to-one>标签,并且用属性unique=true来限定它是唯一的,这样就实现了多的一端的多重性为一。但是,它仍保留多対一的痕迹(比如关系模型中增加一个外键字段)。
1.实体模型:
此处单向是由person加载idcard,所以Person中要保存IdCard的对象。
2.关系模型:
3.实体类:
IdCard.java
public class IdCard {
private Integer id;
private String cardNo;
//一系列的getter.setter方法
@Override
public String toString() {
// TODO Auto-generated method stub
return "Idcard:" + cardNo;
}
}
private Integer id;
private String cardNo;
//一系列的getter.setter方法
@Override
public String toString() {
// TODO Auto-generated method stub
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>
</class>
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="cardNo" length="10"></property>
</class>
Person.hbm.xml
<class name="com.sxt.hibernate.one2one.entity.Person" table="sxt_hibernate_person">
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="name" length="10"></property>
<!--many-to-one标签的含义,是在本表中增加外键指向另一端。
unique="true"含义,是本表的本字段加上唯一性约束.
-->
<many-to-one name="idcard_id" unique="true"></many-to-one>
</class>
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="name" length="10"></property>
<!--many-to-one标签的含义,是在本表中增加外键指向另一端。
unique="true"含义,是本表的本字段加上唯一性约束.
-->
<many-to-one name="idcard_id" unique="true"></many-to-one>
</class>
5.hibernate配置文件:
参照上一篇。
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.setIdCard(idCard);
//不能成功保存,会报错org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.sxt.hibernate.one2one.entity.IdCard
//因为idCard是transient状态
//要在<many-to-one>中加上cascade="save-update",或者是在session.save(person)之前session.save(idCard)
session.save(person);*/
/* IdCard idCard=new IdCard();
idCard.setCardNo("1234567890");
session.save(idCard);
Person person=new Person();
person.setName("张三");
person.setIdCard(idCard);
session.save(person);*/
/**
* 小结:一对一唯一外键关联是多対一关联的特例,它不会默认有cascade属性,因此save对象时要保证它的关联属性是持久化状态的或者手动设置cascade属性.
*/
/**
* 测试加载操作
*/
Person p=(Person)session.load(Person.class, 2);
System.out.println(p);
System.out.println(p.getIdCard());
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
}
Session session = HibernateUtils.getSession();
Transaction t = session.beginTransaction();
try {
/**
* 测试插入操作
*/
/* IdCard idCard=new IdCard();
idCard.setCardNo("1234567890");
Person person=new Person();
person.setIdCard(idCard);
//不能成功保存,会报错org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.sxt.hibernate.one2one.entity.IdCard
//因为idCard是transient状态
//要在<many-to-one>中加上cascade="save-update",或者是在session.save(person)之前session.save(idCard)
session.save(person);*/
/* IdCard idCard=new IdCard();
idCard.setCardNo("1234567890");
session.save(idCard);
Person person=new Person();
person.setName("张三");
person.setIdCard(idCard);
session.save(person);*/
/**
* 小结:一对一唯一外键关联是多対一关联的特例,它不会默认有cascade属性,因此save对象时要保证它的关联属性是持久化状态的或者手动设置cascade属性.
*/
/**
* 测试加载操作
*/
Person p=(Person)session.load(Person.class, 2);
System.out.println(p);
System.out.println(p.getIdCard());
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
}
相关推荐
Hibernate 一对一唯一外键关联映射详解 Hibernate是一种流行的Java持久层框架,提供了多种关联映射方式,其中一对一唯一外键关联映射是一种常见的关联方式。在本文中,我们将详细介绍Hibernate一对一唯一外键关联...
在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的...以上就是关于Hibernate一对一唯一外键关联映射(单向关联)的详细说明。通过这种方式,我们可以轻松地在Java应用中处理数据库的一对一关系。
在本案例中,我们将详细探讨“hibernate一对一唯一外键关联映射(单项关联)”。 首先,一对一关联分为两种类型:单向关联和双向关联。单向关联意味着在一个实体类中存在对另一实体的引用,而另一实体类中没有相应...
本篇主要探讨的是Hibernate中的一对一(OneToOne)关系映射,特别是唯一外键关联(UniDirectional and Bidirectional Association)的情况。我们将深入理解这种关联方式的配置、实现以及它在实际应用中的价值。 1. ...
总的来说,Hibernate的一对一唯一外键关联(单向关联)是通过在一方实体中定义另一方实体的引用,并通过注解或XML映射文件进行配置来实现的。这种关联方式简化了对象关系的管理,但同时也需要开发者在操作关联对象时...
本话题主要探讨的是Hibernate中的一种关联映射方式——一对一(One-to-One)单向外键关联。这种关联模式通常用于两个实体之间存在唯一对应的关系,例如一个用户对应一个唯一的账户。 在Hibernate中,一对一关联可以...
**标题详解:**“Hibernate教程04_关系映射之一对一单向外键关联” 在Hibernate框架中,关系映射是数据库表之间的关联在对象模型中的体现。本教程重点讲解了一对一(One-to-One)单向外键关联的实现方法。在数据库...
在Java的持久化框架Hibernate中,一对一(One-to-One)关联是常见的关系映射类型,它用于表示两个实体之间存在唯一的对应关系。本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的...
本篇将深入探讨Hibernate中的一对一单向外键关联,通过注解和XML配置两种方式进行实现。这种关联允许一个实体类与另一个实体类之间存在一对一的关系,并且只在其中一个实体类中维护这种关系。 首先,我们来理解一对...
首先,一对一外键关联指的是一个实体通过外键直接引用另一个实体的主键。在单向关联中,只有其中一个实体知道另一个实体的存在,而另一个实体则无感知。这种关联通常体现在数据库设计中,比如一个用户只有一个账户,...
在Java持久化框架Hibernate中,一对一(One-to-One)映射是对象关系映射的一种常见方式,用于表示两个实体之间一对一的关系。这种关系通常出现在一个实体的实例只能与另一个实体的单个实例相关联的情况。下面我们将...
在Java持久化框架Hibernate中,一对多外键单向关联是一种常见的关系映射方式,它描述了一对多的关系,其中一个实体(例如Person)可以与多个其他实体(例如Address)相关联,而关联的方向只从多方(Address)指向...
在这个例子中,我们很可能看到的是第一种情况,即在一方实体中定义外键,以实现与另一方实体的一对一单向关联。 **源码实现步骤**: 1. **实体类定义**:创建两个实体类,例如`Person`和`Passport`。`Person`实体...
在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有另一个实体的引用,而双向一对一映射则意味着两个实体都可以互相引用。这种关联关系在数据库层面通常通过主键外键约束来实现,但...
1. **外键约束**:在一对一关联中,通常由一方持有外键,可以是双向关联,也可以是单向关联。 2. **唯一性**:在数据库中,一对一关联的两个表的关联字段必须具有唯一性约束。 3. **性能考虑**:根据业务需求选择...
1. Hibernate 一对一外键单向关联: 在 Hibernate 中,一对一的外键单向关联意味着一个实体类中的属性指向另一个实体类,而另一个实体类并不知道这个关联。这种关联可以通过在 `many-to-one` 元素中添加 `unique=...
在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是一种常见的关系映射方式,用于表示两个实体之间一对一的对应关系。本篇主要探讨的是基于主键(Primary Key)的双向关联映射,这在实际项目中非常常见...
“Hibernate基于外键的一对多单向关联”这个标题指的是在Java持久化框架Hibernate中,如何通过外键实现一个实体类(如订单)与另一个实体类(如商品)之间的一对多关系,并且这种关联是单向的,即从订单端可以访问到...
**标题:** Hibernate一对一关联映射 **描述:** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。一对一(OneToOne)关联映射是Hibernate提供的一种对象关系映射策略,它...