`

hibernate系列(四)一对一关联关系

阅读更多
以Person类和IDCard类为例,这里仅仅说一种一对一关联关系,即Person类拥有IDCard,但是IDCard不含Person类,数据库库的表如下:
CREATE TABLE `hibernate`.`person` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  `age` INT NULL,
  `idcard_id` INT NULL,
  PRIMARY KEY (`id`));

CREATE TABLE `hibernate`.`idcard` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `number` INT NULL,
  `content` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));

Person类如下:
public class Person {

	private Long id;
	private String name;
	private Long age;
	private IDCard idCard;
//省略get、set方法
}

Person类对应的Person.hbm.xml映射文件为:
<hibernate-mapping>
	<class name="com.ligang.domain.Person" table="person">
		<id name="id" column="id" type="long">
			<generator class="identity"/>
		</id>
		<property name="name" column="name" type="string"/>
		<property name="age" column="age" type="long"/>
		<many-to-one name="idCard" class="com.ligang.domain.IDCard" column="idcard_id" cascade="save-update"></many-to-one>
	</class>
</hibernate-mapping>

虽然是一对一但是,这种形式的一对一就是多对一的特例,所以仍然使用<many-to-one>的标签,其中的name指的是Person类的idCard属性,column指的是person表中的字段名为idcard_id,class指的是将IDCard类对应的表的主键的值作为idcard_id的值。cascade字段表示保存Person类时级联的保存IDCard类。
下面看下IDCard类:

public class IDCard {

	private Long id;
	private Long number;
	private String content;
//省略get、set方法
}

IDCard类对应的IDCard.hbm.xml映射文件为:
<hibernate-mapping>
	<class name="com.ligang.domain.IDCard" table="idcard">
		<id name="id" column="id" type="long">
			<generator class="identity"/>
		</id>
		<property name="number" column="number" type="long"/>
		<property name="content" column="content" type="string"/>
	</class>
</hibernate-mapping>

然后就是测试增添方法:
@Test
	public void addPerson(){
		Session session=hibernateDao.getSession();
		Transaction tx=session.beginTransaction();
		
		Person p=new Person();
		p.setName("张三");
		p.setAge(122L);
		
		IDCard idCard=new IDCard();
		idCard.setNumber(123445L);
		idCard.setContent("你是一个人");
		
		p.setIdCard(idCard);
		
		session.save(p);
		
		tx.commit();
		session.close();
	}

此时就会先保存IDCard对象,然后获取其主键并赋值给person表的idcard_id字段,然后增添Person对象。如下sql:
Hibernate: insert into hibernate.idcard (number, content) values (?, ?)
Hibernate: insert into hibernate.person (name, age, idcard_id) values (?, ?, ?)

更新如下:
@Test
	public void updatePerson(){
		Session session=hibernateDao.getSession();
		Transaction tx=session.beginTransaction();
		
		Person p=(Person) session.get(Person.class,6L);
		p.setName("张三");
		p.setAge(122L);
		
		IDCard idCard=new IDCard();
		idCard.setNumber(123445L);
		idCard.setContent("你是一个人");
		
		p.setIdCard(idCard);
		
		session.save(p);
		
		tx.commit();
		session.close();
	}

此时的sql如下:
Hibernate: select person0_.id as id1_3_0_, person0_.name as name2_3_0_, person0_.age as age3_3_0_, person0_.idcard_id as idcard_i4_3_0_ from hibernate.person person0_ where person0_.id=?
Hibernate: insert into hibernate.idcard (number, content) values (?, ?)
Hibernate: update hibernate.person set name=?, age=?, idcard_id=? where id=?

此时并没有删除原有的IDCard,只是根据Person再也找不到它了。目前我还不知道怎么设置来删除无用的IDCard。

获取:由Person的主键获取IDCard比较容易,但是如果想从IDCard主键获取Person呢?
首先更改IDCard类,添加person属性:

public class IDCard {

	private Long id;
	private Long number;
	private String content;
	private Person person;
//略get、set方法
}

然后更改上述的IDCard.hbm.xml映射文件如下:
<hibernate-mapping>
	<class name="com.ligang.domain.IDCard" table="idcard">
		<id name="id" column="id" type="long">
			<generator class="identity"/>
		</id>
		<property name="number" column="number" type="long"/>
		<property name="content" column="content" type="string"/>
		<one-to-one name="person" property-ref="idCard"></one-to-one>
	</class>
</hibernate-mapping>

添加了<one-to-one>标签,同时使用了property-ref属性,看下查询再解释:
@Test
	public void getPerson(){
		Session session=hibernateDao.getSession();
		Transaction tx=session.beginTransaction();
		
		IDCard idCard=(IDCard) session.get(IDCard.class,2L);
		System.out.println(idCard.getPerson().getName());
		
		tx.commit();
		session.close();
	}

查询的sql如下:
Hibernate: select idcard0_.id as id1_1_0_, idcard0_.number as number2_1_0_, idcard0_.content as content3_1_0_, person1_.id as id1_3_1_, person1_.name as name2_3_1_, person1_.age as age3_3_1_, person1_.idcard_id as idcard_i4_3_1_ from hibernate.idcard idcard0_ left outer join hibernate.person person1_ on idcard0_.id=person1_.idcard_id where idcard0_.id=?
张三

将Person查出来了,然后看下他是怎么查的,看下IDCard的<one-to-one name="person" property-ref="idCard">,name指的是IDCard的person属性,而property-ref指向了另一个类的属性,这里就是Person类的idCard属性,要想查出Person总要告诉hibernate idcard表的哪个字段和person表的哪个字段相连接吧,这里的property-ref="idCard",即指定了要和Person类的idCard属性所对应的字段相连接,默认是采用主键来和该字段相连接的,我不知道能否指定。即idcard表的主键id和Person类的idCard属性对应的字段idcard_id相连接,来查询Person,看sql语句:hibernate.idcard idcard0_ left outer join hibernate.person person1_ on idcard0_.id=person1_.idcard_id

上述一对一的关联关系是通过外键来连接,他们也可以使用相同的主键实现一对一。这里不再讲述。

若想转载请注明出处:  http://lgbolgger.iteye.com/blog/2125020
作者:iteye的乒乓狂魔
分享到:
评论

相关推荐

    hibernate一对一关联关系

    本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,比如一个人只有一个身份证,或者一个公司的总部只有一个。在Hibernate中,设置一对一关联关系可以帮助我们更好地管理和操作...

    hibernate主键实现一对一单向关联关系源码

    首先,我们需要理解一对一关联关系的基本概念。在数据库中,一对一关系意味着两个表中的每一条记录都对应另一表中的唯一一条记录。在Hibernate中,这种关系可以通过共享主键或外键来实现。由于题目中提到的是“主键...

    hibernate外键实现一对一单向关联关系源码

    **一对一关联关系**在数据库设计中表示两个表之间存在唯一的对应关系,例如,一个人可能只有一个护照,或者一个员工只有一个职位。在Hibernate中,这种关系可以通过外键(Foreign Key)在一方或双方实体中实现。 **...

    hibernate外键实现一对一双向关联关系源码

    在实际应用中,确保在两个实体类间的一对一关联正确无误非常重要。在创建和更新关联时,应避免循环引用和数据不一致的问题。在保存或更新对象时,需确保在双方都进行了正确的设置。 8. **性能考虑**: 一对一双向...

    Hibernate ORM - 一对一主键关联关系

    - **外键约束**:在一对一关联中,如果不使用共享主键,可以创建外键约束,但这样就不再是真正的“主键关联”。 - **懒加载与立即加载**:默认情况下,关联对象会在加载主对象时一同加载,这称为“立即加载”。若...

    hibernate多对一单向关联关系实现源码

    首先,我们要理解Hibernate是如何处理多对一关联的。在Hibernate中,我们通过在实体类中添加注解或配置XML文件来定义这种关系。对于单向多对一关联,通常是在多方(拥有多个实体)的类中添加一个对单方(拥有单一...

    Hibernate ORM - 一对多双向关联关系

    这个压缩包文件“HibernateORM”很可能包含了关于如何在实际项目中设置和使用Hibernate一对多双向关联的示例代码、配置文件或者详细教程。通过学习这些材料,开发者能够深入理解如何在Java应用中利用Hibernate来处理...

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    hibernate使用主键关联的一对一关系

    在Java的持久化框架Hibernate中,一对一(OneToOne)关系是一种常见的对象关系映射(ORM)配置,用于表示两个实体类之间的一种唯一关联。在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来...

    Hibernate ORM - 一对一连接表关联关系

    描述部分虽然为空,但我们可以根据标题推测,这篇内容可能涉及了如何在Hibernate中配置和使用一对一关联,包括实体类的设计、注解的使用以及数据库表的结构设计等。 **知识点详解** 1. **Hibernate ORM框架**: ...

    Hibernate一对一唯一外键关联映射(双向关联)

    一、Hibernate一对一关联类型 一对一关联在现实世界中很常见,例如一个人只有一个身份证,一个身份证也只能属于一个人。在数据库设计中,这种关系通常通过主键和外键的方式实现,其中一方的主键作为另一方的外键,...

    hibernate一对一之唯一外键关联(双向关联)

    - 一对一关联意味着两个实体类之间存在一对一的关系,比如一个人只有一个身份证,一个身份证也只对应一个人。这种关系在数据库中通常通过一个主键或外键来实现。 2. **唯一外键关联** - 在一对一关联中,唯一外键...

    Hibernate一对多使用非主键关联设置

    在Java的持久化框架Hibernate中,一对多关系是常见的实体关联类型,特别是在处理数据库中的表结构时。在标准的关系型数据库设计中,一对多关系意味着一个表中的记录可以与另一个表中的多个记录相关联。例如,一个...

    hibernate一对一主键关联映射(单项关联)

    - **唯一性约束**:在数据库层面,为了确保一对一关联,通常需要添加唯一性约束。例如,`IdCard`表的`person_id`列应具有唯一性约束。 以上就是关于Hibernate中一对一主键关联映射(单项关联)的详细解释。通过这种...

    Hibernate ORM - 一对一外键关联关系

    1. **一对一外键关联配置**:在Hibernate中,可以通过在映射文件中添加`&lt;one-to-one&gt;`标签或在实体类上使用`@OneToOne`注解来定义一对一关联。关联的外键通常位于被引用的实体(“一对一”关系的“一”端)中。 2. ...

    Hibernate教程05_关系映射之一对一双向外键关联

    在Hibernate中,一对一关联的配置主要通过注解或XML配置文件完成。对于双向关联,我们需要在两个实体类中分别设置相应的属性和关联注解。 在实体类A中,我们将添加一个类型为B的属性,并使用`@OneToOne`注解来指定...

    Hibernate一对一主键关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系映射方式之一,尤其在处理两个实体之间存在唯一对应关系时非常有用。本篇将重点讲解如何实现一对一主键关联映射的单向关联,并通过一个...

    Hibernate映射一对多关联关系

    ### Hibernate映射一对多关联关系 #### 知识点概览 - **概念解析**:一对多(One-to-Many)关联关系的概念及其在Hibernate中的实现方式。 - **域模型设计**:创建具有一个实体与多个实体关联的域模型。 - **关系...

    Hibernate一对一,一对多,多对多实例

    一对一关联通常出现在两个实体之间存在唯一对应关系的情况,例如一个人只有一个身份证。在Hibernate中,可以通过在实体类的属性上使用`@OneToOne`注解来定义这种关系。此外,还需要通过`@PrimaryKeyJoinColumn`或`@...

    Hibernate一对一主键关联映射(双向关联)

    标题"Hibernate一对一主键关联映射(双向关联)"中的"主键关联"指的是两个实体通过共享相同的主键来建立关联。"双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,...

Global site tag (gtag.js) - Google Analytics