双向一对一

@OneToOne注解用来一对一映射;

需要在被维护关系的一端加上属性 mappedBy 来表示放弃维护关联关系;

例如:可以建立两个类 Company、Boss;

假设一个公司只有一个老板,而一个老板只有一个公司;只是这么假设;

Boss类:

维护关联关系的一端需要用@JoinColumn注解的name 属性来指定外键名;

注意:由于是一对一映射,需要加上unique=true属性;

@JoinColumn(name="b_id",unique=true)

@OneToOne

private Boss boss;

Company类:

不维护关联关系的一端要在@OneToOne里面添加mappedBy属性来指定用另一个类的哪个属性来映射关联关系;

也就是说mappedBy的值是另一个类中外键类属性的属性名;例如Boss类中的 private Company company;

有了mappedBy就不能用@JoinColumn;

@OneToOne(mappedBy="boss")

private Company company;

1.插入

//测试一对一添加

@Test

public void testInsert(){

Boss boss=new Boss();

boss.setBname("曹操老板");

Company company=new Company();

company.setCname("曹魏集团");

boss.setCompany(company);

company.setBoss(boss);

manager.persist(company);

manager.persist(boss);

}

结果:

Hibernate:

insert

into

tb_comp

(b_id, cname)

values

(?, ?)

Hibernate:

insert

into

tb_boss

(bname)

values

(?)

Hibernate:

update

tb_comp

set

b_id=?,

cname=?

where

cid=?

插入成功后,维护关联关系的company对应的表中会多出一列外键;

如果是先插入维护关联关系的一方,则会有一条update语句;

如果是先插入不维护关联关系的一方,这里是boss,将不会有update语句;

在插入时建议先插入没有外键的一方;

2.查询

1)如果查询维护关联关系的一端

//测试一对一查找

@Test

public void testFind(){

Company comp=manager.find(Company.class, 1);

}

结果:

Hibernate:

select

company0_.cid as cid1_1_1_,

company0_.b_id as b_id3_1_1_,

company0_.cname as cname2_1_1_,

boss1_.bid as bid1_0_0_,

boss1_.bname as bname2_0_0_

from

tb_comp company0_

left outer join

tb_boss boss1_

on company0_.b_id=boss1_.bid

where

company0_.cid=?

Hibernate:

select

company0_.cid as cid1_1_1_,

company0_.b_id as b_id3_1_1_,

company0_.cname as cname2_1_1_,

boss1_.bid as bid1_0_0_,

boss1_.bname as bname2_0_0_

from

tb_comp company0_

left outer join

tb_boss boss1_

on company0_.b_id=boss1_.bid

where

company0_.b_id=?

默认会通过左外链接来查询;并且发出两条查询语句;

可以通过在@OneToOne注解后面加上 fetch属性,改为懒加载;会只有一条查询语句;

@JoinColumn(name="b_id",unique=true)

@OneToOne(fetch=FetchType.LAZY)

private Boss boss;

改为懒加载后的结果:

Hibernate:

select

company0_.cid as cid1_1_0_,

company0_.b_id as b_id3_1_0_,

company0_.cname as cname2_1_0_

from

tb_comp company0_

where

company0_.cid=?

2)查询不维护关联关系的一端

//查询不维护关联关系的一端

@Test

public void testFind2(){

Boss boss=manager.find(Boss.class, 1);

}

结果:

Hibernate:

select

boss0_.bid as bid1_0_1_,

boss0_.bname as bname2_0_1_,

company1_.cid as cid1_1_0_,

company1_.b_id as b_id3_1_0_,

company1_.cname as cname2_1_0_

from

tb_boss boss0_

left outer join

tb_comp company1_

on boss0_.bid=company1_.b_id

where

boss0_.bid=?

会发出一条左外连接查询;

如果改为修改 fetch为懒加载 会发出两条查询语句;

因为Boss类对应的表中没有外键;

因此不可能生成通过外键id生成代理对象;

只能发出两条sql或进行左外连接查询否则无法处理关联的对象的信息 ;

通常不维持关联关系的一端不建议用懒加载;

原文地址:https://www.cnblogs.com/ShiningArmor/p/10600176.html

时间: 2025-02-01 19:45:20

双向一对一的相关文章

Hibernate关系映射(二) 基于外键的双向一对一

基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 Account.cs,需要添加被控端的引用 package com.lxit.entity; import java.io.Serializable; public class Account implements Serializable{ public Account(){ } private int

JPA学习笔记(9)——映射双向一对一关联关系

双向一对一关联关系 一个部门有一个经理,一个经理管一个部门 Department实体类 package com.jpa.helloworld2; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; impo

java之hibernate之基于外键的双向一对一关联映射

这篇讲解 基于外键的双向一对一关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 2.类结构 Person.java public class Person implements Serializable{ private int id; private String name; private IdCard idCard; public Person() { } public Person(String name) { super(); this.name = name;

Hibernate中双向一对一保存数据的问题

private static void test10() { // 获得session 对象 SessionFactory sessionFactory = new Configuration().configure() .buildSessionFactory(); Session session = sessionFactory.openSession(); // session开启事务 session.beginTransaction(); // 创建 一对一 对象数据 PersonInf

jpa的双向一对多和双向一对一关联关系

在分享之前先给大家看两个异常,应该说这一类的异常还是很常见的,主要原因是jar包冲突 异常1: java.lang.NoSuchFieldError: INSTANCE at org.hibernate.type.BasicTypeRegistry.<init>(BasicTypeRegistry.java:94) at org.hibernate.type.TypeResolver.<init>(TypeResolver.java:59) at org.hibernate.cfg

hibernate 之 关联映射的基于外键的双向一对一关联

1. 人和身份证是一个一对一的关系,他们的表结构为: 2. 类结构:Person.java public class Person { private int id; private String name; private int age; private IdCard idCard; public Person() { } public Person(String name, int age) { super(); this.name = name; this.age = age; } pu

jpa双向一对一关联关系

1.1.  关系维护方 Person.java package com.morris.entity; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persi

hibernate双向一对一

package com.bjsxt.hibernate.oneToOne; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn

JPA学习笔记-映射双向一对一的关联关系

Manager类 @Table(name="jpa_manager") @Entity public class Manager { @GeneratedValue @Id private Integer id; @Column(name="manager_name") private String managerName; //没有外键的一方,不维护关联关系 // @OneToOne(mappedBy="manager", fetch=Fetc