IdCard.java类
public class IdCard {
private int id;
private String cardNo;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
}
Person.java类
public class Person {
private int id;
private String name;
private IdCard idCard;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
}
}
IdCard.hbm.xml映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native">
</generator>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
Person.hbm.xml映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.hibernate.Person" table="t_person">
<id name="id">
<!-- 采用foreign生成策略,foreign会取得关联对象的标识 -->
<generator class="foreign">
<!-- property只关联对象 -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<!-- one-to-one指示hibernate如何加载其关联对象,默认根据主键加载
也就是拿到关系字段值,根据对端的主键来加载关联对象
-->
<one-to-one name="idCard" constrained="true"/>
</class>
</hibernate-mapping>
hibernate.cfg.xml配置文件
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_one2one_pk_1</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="com/hibernate/Person.hbm.xml"/>
<mapping resource="com/hibernate/IdCard.hbm.xml"/>
</session-factory>
</hibernate-configuration>
One2OneTest.java测试类(里面用到的工具类前面的博客中已经给出)
public void testSave1(){
Session session = null;
try{
session = HibernateUtils.getSession();
session.beginTransaction();
IdCard idCard = new IdCard();
idCard.setCardNo("1111111111111111111");
Person person = new Person();
person.setName("张三");
//建立关联
person.setIdCard(idCard);
//没有抛出TransientObjectException
//是由一对一关联映射的特性决定的,它必须先保存关联对象IdCard
//这样它采用foreign映射策略才能取得关联对象的标识
//也就是它默认了cascade属性
session.save(person);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
测试结果(发出的sql语句):
Hibernate: insert into t_idCard (cardNo) values (?)
Hibernate: insert into t_person (name, id) values (?, ?)
分享到:
相关推荐
在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一个实体并不知情。这里我们讨论的是单向外键关联,即一方实体持有了另一方的外键。 在Hibernate中,一对一关联可以通过`@OneToOne`注解来实现。这个...
通过以上步骤,我们就可以在Hibernate中实现单向一对一主键映射。这个实例中的`hibernate_fifth_one2one_pk_1`文件可能包含了相关的代码示例或测试用例,供你参考和学习。理解并掌握一对一映射是提高Hibernate使用...
本文将详细解析如何实现一对一唯一外键(Uniquely Foreign Key,UFK)关联映射,特别是在单向关联的情况下的具体操作。 在一对一的关联中,两个实体类之间存在一对一的关系,比如一个用户只有一个身份证,或者一辆...
在多对多关联中,两个实体类可以相互拥有多个实例,但只在一个方向上建立关联。例如,学生和课程的关系,一个学生可以选修多门课程,而一门课程也可以被多个学生选修。在这个场景下,"学生"和"课程"之间的关联就是多...
- **主键关联**:通过主键进行关联,即一方的主键作为另一方的外键。这种方式要求关联的两方具有相同的主键类型。 - **外键关联**:通过额外的外键字段进行关联,通常需要指定`@JoinColumn`注解。 4. **级联操作*...
- 在一对一关联中,唯一外键关联是指在一个实体中定义了另一个实体的主键作为其字段,形成外键约束,确保了数据的一致性和完整性。 3. **双向关联与单向关联** - **单向关联**:只有一方知道另一方的存在,例如...
主键关联是最简单的一对一映射方式,两个实体类共享同一个主键。在XML配置文件中,我们可以在任意一方的实体类中声明`<one-to-one>`标签,例如: ```xml <!-- Address的其他属性 --> ```...
在Hibernate中,一对一关联可以被进一步细分为单向关联和双向关联,以及基于主键关联和基于外键关联。 #### 单向关联 - **基于主键关联**:在这种情况下,两个实体中的一个实体的主键作为另一个实体的外键,实现了...
总结来说,JPA的一对一实例配置是通过`@OneToOne`注解实现的,可以方便地管理两个实体之间的单向或双向一对一关系。理解并熟练运用这一特性,有助于我们在Java应用中更有效地处理数据持久化,提高开发效率。
首先,一对一关联分为两种类型:单向关联和双向关联。单向关联意味着在一个实体类中存在对另一实体的引用,而另一实体类中没有相应的引用。唯一外键关联则表示在两个表之间通过一个外键字段建立一对一关系,这个外键...
7. **注解映射(Annotation Mapping)**:使用Java注解替代XML映射,更简洁直观,例如`@ManyToOne`表示多对一的关联。 8. **SessionFactory**:Hibernate的核心工厂类,用于创建Session对象。 9. **Session**:是...
这种方式是将两个实体共享同一个主键字段,实现一对一的关联。这种方式适用于两个实体之间紧密相关的情况。 ##### 3. 连接表单向关联 当需要避免在实体中添加额外的外键字段时,可以通过创建一个中间表来实现一对...
在关系型数据库中,两个表之间可能存在多对多关联,意味着一个表中的记录可以对应另一表中的多个记录,反之亦然。例如,学生和课程的关系,一个学生可以选修多门课程,而一门课程也可以被多个学生选修。 在...
在单向一对一关系中,`@OneToOne`注解用于指定与另一个实体的关联。它可以放在属性上,例如: ```java @Entity public class User { @Id private Long id; @OneToOne private Profile profile; } ``` 在双向...
本实例主要探讨的是Hibernate的高级映射技术,包括单向一对一、单向多对一、单向一对多以及单向多对多这四种关系映射。 首先,我们来理解一下什么是映射。在Hibernate中,映射是将对象模型与关系数据库之间的桥梁,...
3. **多对一关联(Many-to-One)**:这是对一对一关联的反转,多个实例可以关联到一个实例。例如,多个租户可能都租住同一个房源。 4. **多对多关联(Many-to-Many)**:一个实例可以与多个实例相关联,反之亦然,...
在数据库设计中,通常只支持单向的多对一或一对一关联,这是因为数据库的主外键机制只允许从“多”的方向参照“一”的方向,以此减少数据冗余。 #### 四、映射多对一单向关联关系实例 以BookList到Students的多对...
#### 一对一主键关联映射_单向(one-to-one) - **对象模型**:展示了两个实体类之间的一对一关系。 - **IdCard实体类**:表示身份证信息。 - **Person实体类**:表示个人信息。 - **IdCard实体类的映射文件**:...
本文将深入探讨三种主要的关系映射类型:一对一(One-to-One)、多对一(Many-to-One)和多对多(Many-to-Many),并提供具体实例代码。 **一对一(One-to-One)关系** 一对一关系意味着两个实体之间存在一对一的...