在hibernate一对一实体映射中,常用有2种方式,一种就是把一对一看作多对一的一个特例,即通过外健参考。另一种是通过主健参考,限制2个数据表中的主健使用相同的值。
看如下一个例子:一个顾客住一个房间。如果使用不同的方式,其数据表的设计是不同的(这里hibernate的具体用法就不细述了)。如果是通过外健连接,就是一对多的特例,其表结构如图:
hibername的配置文件如下:
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hiber">
<class name="User" table="user">
<id name="id" column="user_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
<property name="name" column="name" type="string"></property>
<many-to-one name="room" column="ROOM_ID" class="Room" cascade="all" unique="true"/>
</class>
</hibernate-mapping>
常见问题说明:cascade="all",cascade (级联),指主控方执行操作时,关联对象是否同步执行同一操作。例如:对主控方调用sava-update或delete方法时,是否对关联对象进行同样的操作。此处设置为all,表示无论主控方执行何种操作(insert,update,delete)都对其关联对象执行同样的操作
Room.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hiber">
<class name="Room" table="room">
<id name="id" column="room_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
<property name="address" column="address" type="string"></property>
<one-to-one name="user" class="User" property-ref="room"></one-to-one>
</class>
</hibernate-mapping>
另外一种方式是一对一的主键关联。限制兩各数据表的主键使用相同的值,如此一个User与Room就是一对一关系。如图:
hibernate的配置文件如下
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hiber">
<class name="User" table="user">
<id name="id" column="user_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
<property name="name" column="name" type="string"></property>
<one-to-one name="room" class="Room" cascade="all"></one-to-one>
</class>
</hibernate-mapping>
Room.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hiber">
<class name="Room" table="room">
<id name="id" column="room_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
<property name="address" column="address" type="string"></property>
<one-to-one name="user" class="User" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
注:在一对一主键对应时
<id name="id" column="room_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
可以用
<id name="id" column="room_id" unsaved-value="0">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
替换。即第二种方式不需要再创见主键生成器。
注:在Room.hbm.xml这里,必須限制其主键与User的主键相同,而在属性上,使用 constrained="true"(约束条件)告诉Hibernate参考至User的主键。由于采用了主键关联,那么通过主键关联的两张表,其关联的主键值必须保持同步。也就是说,只需要为一张表设置主键生产器,而另一张表的主键与之共享同一主键值。
- 大小: 8.1 KB
- 大小: 7.2 KB
分享到:
相关推荐
在 Hibernate 映射中,需要使用 `one-to-one` 元素,并设置 `constrained="true"`,表明该类的主键由关联类生成。 3. Hibernate 一对一连接表单向关联: 这种关联方式是通过额外的连接表来实现一对一关系的。连接...
3. **映射文件**:如果使用传统的Hibernate XML映射文件,需要在`.hbm.xml`文件中配置多对一关联,设置`<many-to-one>`标签。如果是注解方式,直接在Java类中使用上述提到的注解。 4. **数据访问对象(DAO)**:...
作者可能会讨论如何处理关联的懒加载和即时加载,以及可能遇到的问题和解决方案。 ### 实际应用 在实际开发中,一对一关系常用于那些逻辑上紧密耦合但又需要独立存储的数据模型,如用户个人信息和用户账户信息,...
无论是简单的一对一、一对多,还是复杂的多对多关系,Hibernate都能提供相应的解决方案,极大地简化了数据访问层的开发工作。理解并掌握这些关系映射技巧,对于高效地使用Hibernate进行数据库操作至关重要。
10. **一对多(One-to-Many)、多对一(Many-to-One)、多对多(Many-to-Many)关系**:Hibernate支持各种关联映射,使得处理复杂的数据结构变得更加简单。 学习和掌握Hibernate 3.1,不仅可以深入了解ORM的工作...
9. **一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)关联**:Hibernate支持各种关联关系的映射,允许开发者定义对象间的复杂关系。 10. **继承映射**:包括单表继承、联合继承和表格-per-...
在实际应用中,对象之间的关联关系是非常常见的,而Hibernate同样提供了一套完善的解决方案来处理这些关系。本文将以“Hibernate关联关系”为主题,详细介绍Hibernate中关联关系的创建及使用方法。 #### 关联关系...
当两个对象之间存在一对多(one-to-many)或多对多(many-to-many)的关系,并且在一方(如one)设置了级联删除(cascade)属性,删除one对象时会尝试删除与其关联的所有many对象。如果此时many对象也被其他对象...
- 通过配置文件如`one-to-many`、`many-to-one`、`many-to-many`等映射关系,实现类与类的关联。 8. **Hibernate缓存机制**: - **一级缓存**(内部缓存):默认事务级缓存,每个Session内部维护。 - **二级缓存...
在本篇文章中,我们将深入探讨如何实现双向关联的一对多映射,以及在实际应用中可能会遇到的问题和解决方案。 首先,我们需要了解什么是双向关联。在Hibernate的一对多关联中,双向关联意味着双方都可以通过导航...
</many-to-one> <one-to-manyclass="com.hill.eqss.bo.Popedom"/> <keycolumn="popedomid"></key> <many-to-manyclass="com.hill.eqss.bo.Role"column="roleid"/> ``` - **role.hbm.xml**(部分...
总之,Hibernate 作为 Java 开发中的 ORM 解决方案,极大地简化了数据库操作,提高了开发效率。它通过对象关系映射和强大的查询语言,使得开发者可以专注于业务逻辑,而不是底层的数据操作。尽管 Hibernate 学习曲线...
在Java的持久化框架Hibernate中,多对一(Many-to-One)映射是一种常见的关联关系。这种关系表示在一个实体类中可以引用另一个实体类的多个实例,而在被引用的实体类中,每个实例只被一个引用实体类实例引用。本文将...
Hibernate是一种开源的对象关系映射(Object-Relational Mapping,简称ORM)框架,它为Java应用提供了利用SQL数据的持久化解决方案。通过ORM技术,开发人员可以将Java对象映射到数据库表上,从而避免了大量的SQL代码...
- 多对多:使用many-to-many标签,通常需要一个关联表来维护两个实体之间的关系 以上只是一部分常见的Hibernate面试问题,完整的面试问题集可能会涉及更多高级主题,如第二级缓存、事务管理、Hibernate的事件监听器...
这种关系主要体现在表与表之间的关系上,我们可以通过配置文件中的many-to-one、one-to-many、many-to-many等来实现这种关系。 Hibernate的缓存机制 Hibernate提供了两种缓存机制: 1. 一级缓存(内部缓存):...
- **一对一(one-to-one)**: 实体间的一对一关系。 #### 7. 组件映射 - **组件映射**: 将Java对象中的某个属性映射为数据库表中的多个字段。 #### 8. 继承映射 - **继承映射**: 支持多种继承策略,如单表继承...
11. **一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)关联**:这些是数据库关系映射的关键,Hibernate提供了多种映射方式来处理这些关联。 12. **集合映射**:包括List、Set、Map等类型的...
ORM的具体实现涉及多种映射策略,例如一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)。这些策略的选择取决于具体的应用场景和需求。 #### 持久化操作 Hibernate...