`
从此醉
  • 浏览: 1048083 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

Hibernate 一对一双向关联深入详解

 
阅读更多

1、一对一相对比较简单。hibernate主要是帮助我们保持了两张表的id一致!

先建两张表

create table h_01.idcard (id integer not null, num integer, primary key (id));
create table h_01.student (id integer not null, name varchar(255), primary key (id));

然后是POJO

package modle;

public class IdCard {
	private int id;
	private int num;
	private Student student;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public Student getStudent() {
		return student;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
}

package modle;

public class Student {
	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;
	}
	
}

然后是映射文件:

重要的是这个地方:

<generator class="foreign">
<param name="property">student</param>
</generator>

表示IdCard的id是根据student的id生成的。 generator就是定义id的生成方式。 param是定义有那个属性,即student来确定id.


<hibernate-mapping>
    <class name="modle.IdCard" table="idcard" catalog="h_01">
  		<id name="id" type="int">
  			<generator class="foreign">
  				<param name="property">student</param>
  			</generator>
  		</id>
  		<property name="num" type="int"></property>
    	<one-to-one name="student" class="modle.Student" fetch="select" ></one-to-one>
    </class>
</hibernate-mapping>

再说下查询:

1、一对一,hibernate默认的是用左外连接查询。

比如,查询一个student, hibernate使用做外连接直接查询除了idcard.

Hibernate: select student0_.id as id3_2_, student0_.name as name3_2_, idcard1_.id as id4_0_, idcard1_.num as num4_0_, student2_.id as id3_1_, student2_.name as name3_1_ from h_01.student student0_ left outer join h_01.idcard idcard1_ on student0_.id=idcard1_.id left outer join h_01.student student2_ on idcard1_.id=student2_.id where student0_.id=?

有事我们并不需要idcard,为了速度 。 可以用延迟加载。
需要修改下查询方式,即fetch属性的配置,默认是join

<one-to-one name="student" class="modle.Student" fetch="select" ></one-to-one>

注意:两个配置文件都要修改!

这下查询就变成了:


Hibernate: select student0_.id as id3_0_, student0_.name as name3_0_ from h_01.student student0_ where student0_.id=?
Hibernate: select idcard0_.id as id4_0_, idcard0_.num as num4_0_ from h_01.idcard idcard0_ where idcard0_.id=?

之所以有两个查询语句,因为我使用了card对象。所以又查询了card


2、默认对student的保存是不级联的。不知道是不是和版本有关。

可以把student配置设置为级联的。


分享到:
评论

相关推荐

    hibernate关联映射详解

    包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。

    hibernate对映射xml的一对多的双向关联详解

    NULL 博文链接:https://hi-beijing.iteye.com/blog/1315150

    10_传智播客JPA详解_JPA中的一对多双向关联与级联操作

    10_传智播客JPA详解_JPA中的一对多双向关联与级联操作.rar

    Hibernate映射关联详解

    映射一对多双向关联关系 1 Customers 类中加如set类型的 Orders属性,Orders类中加入Customer类型的customer属性。 2 测试时,建立两者一对多的双向关联关系。 Customers customer=new Customer(“Tom”,new ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     7.2 映射一对多双向关联关系  7.2.1 元素的inverse属性  7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上) ...

    hibernate 框架详解

    一对一(one to one) 8.5. 使用连接表的双向关联(Bidirectional associations with join tables) 8.5.1. 一对多(one to many) /多对一( many to one) 8.5.2. 一对一(one to one) 8.5.3. 多对多...

    Hibernate实战(第2版 中文高清版)

     7.1.2 一对一的外键关联   7.1.3 用联结表映射   7.2 多值的实体关联   7.2.1 一对多关联   7.2.2 多对多关联   7.2.3 把列添加到联结表   7.2.4 映射map   7.3 多态关联   7.3.1 多态的多对一...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     7.2 映射一对多双向关联关系  7.2.1 元素的inverse属性  7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上) ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     7.2 映射一对多双向关联关系  7.2.1 元素的inverse属性  7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上) ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     7.2 映射一对多双向关联关系  7.2.1 元素的inverse属性  7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上) ...

    低清版 大型门户网站是这样炼成的.pdf

    4.3.4 映射一对一关联关系 228 4.3.5 映射多对一单向关联关系 235 4.3.6 映射一对多双向关联关系 239 4.3.7 映射一对多双向自身关联关系 244 4.3.8 映射多对多单向关联关系 247 4.3.9 映射多对多双向关联关系 ...

Global site tag (gtag.js) - Google Analytics