Hibernate(六)一对一映射关系

  • One to One 映射关系(只有当映射自定义对象时,才会用,hibernate支持的java类型都可直接设成属性,了解第一和第二种的xml即可)
    • 基于键的向一对一 (xml和annotation都实现了)
    • 基于键的向一对一(xml和annotation都实现了)
    • 基于键的向一对一(xml实现了)
    • 基于键的向一对一 (未实现)
      注: Project中使用XML/Annotation时应统一

一、基于外键的单向一对一
  例子:一本书只有一个主人,能通过书查找修改人的信息,不能通过人查找修改书的信息
类属性变化:Book类中要添加user类的对象,并提供get和set方法,User类无需修改属性

  • XML

Book类

<hibernate-mapping>
	<class name="test.Book" table="hbn_book" >
		<!--name属性名,class类的位置,column外键列的名称,unique限定为唯一-->
		<many-to-one name="user" class="test.User" column="uid" unique="true" />		
	</class>
</hibernate-mapping>
  • Annotation:

Book类

@OneToOne() 
@JoinColumn(name="uid",unique=true)//unique限定是关键
private User user;

二、基于外键的双向一对一
  例子:一本书只有一个主人,能通过书查找修改人的信息,也能通过人查找修改书的信息
类属性变化:Book类中要添加user类的对象,User类要添加book类的对象,并提供get和set方法

  • XML

Book类


<hibernate-mapping>
	<class name="test.Book" table="hbn_book" >
		<!--name属性名,class类的位置,column外键列的名称,unique限定为唯一-->
		<many-to-one name="user" class="test.User" column="uid" unique="true" />		
	</class>
</hibernate-mapping>

User类


<hibernate-mapping>
	<class name="test.User" table="hbn_user" >
		<!--name属性名,property-ref关联many-to-one中的name属性,它的名字一样-->
		<one-to-one name="book" property-ref="user"></one-to-one>
	</class>
</hibernate-mapping>
  • Annotation:

Book类

@OneToOne(mappedBy="book")//被下面User类中的book属性关联
private User user;

User类

@OneToOne
@JoinColumn(name="bid",unique=true)//外键列名
private Book book;

三、基于主键的单向一对一
  例子:一本书只有一个主人,能通过书查找修改人的信息,不能通过人查找修改书的信息
类属性变化:Book类中要添加user类的对象,并提供get和set方法,User类无需修改属性

  • XML

Book类

<hibernate-mapping>
	<id name="id"><!--此处的foreign生成策略,会取得关联对象的标识,property标签内是关联对象-->
	    <generator class="foreign">
	        <param name="property">user</param>
	    </generator>
	</id>
	<class name="test.Book" table="hbn_book" >
	<!--one-to-one标签指示hibernate如何加载其关联对象,默认根据主键加载也就是拿到关系字段值,
	根据对端的主键来加载关联对象。constrained="true"表示当前Book的主键id还是一个外键,
	参照了对应端的主键user的id主键,会生成外键约束语句。-->
		<one-to-one name="user" constrained="true" />	
	</class>
</hibernate-mapping>

注:采用foreign映射策略在保存book对象的同时也会保存关联的对象,也就是user,他们之间还有级联关系。但是反之就不可以,也就是说,如果只保存user对象,是会出错的,不会保存book对象,因为关系的维护端在book端,user根本就不知道book的存在。主键关联映射有弊端,不好维护

  • Annotation: 未知

Book类


四、基于主键的双向一对一
  例子:一本书只有一个主人,一个人只有一本书,能通过书查找修改人的信息,也能通过人查找修改书的信息
类属性变化:Book类中要添加user类的对象,User类要添加book类的对象,并提供get和set方法

  • XML

Book类

<hibernate-mapping>
	<class name="test.Book" table="hbn_book" >
		<one-to-one name="user" constrained="true" cascade="save-update" />	
		<!--constrained(约束) 表明该类对应的数据库表,和被关联的对象所对应的数据库表之间,
		通过一个外键引用对主键进行约束。这个选项影响save() 和delete() 在级联执行时的先后顺序-->
	</class>
</hibernate-mapping>

User类

<hibernate-mapping>
	<class name="test.User" table="hbn_user" >
		<one-to-one name="book" constrained="true" cascade="save-update" />
	</class>
</hibernate-mapping>
  • Annotation: 未知

Book类


注:
1、在没有设置级联时,映射之间有依赖,需要注意保存的先后
2、单向时把没映射的对象,对应的get和set方法都删了
3、主键如果使用自增,注意session.save的顺序会影响id的顺序,并且不要用uuid
4、如果关系通过中间表维护,修改关系,只会删除中间表的记录
5、在session关闭前出现了异常,缓存建议清空一次,session可能残留对象
6、从多的一方维护获取信息,sql语句会少,效率会高

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate是一个Java持久化框架,它能够将Java对象映射到数据库中的表格,同时支持各种关系数据库,如MySQL、Oracle等。在Hibernate中,对于一对一、一对多和多对多的关系,我们可以通过以下方式进行映射一对一关系:在Hibernate中,可以通过主键关联和外键关联来实现一对一关系映射。主键关联是指两个实体之间的关联通过主键来进行,可以使用@PrimaryKeyJoinColumn注解将两个实体关联起来。外键关联是指通过一个实体引用另一个实体的主键作为外键,使用@JoinColumn注解来指定外键属性。 一对多关系:在Hibernate中,一对多关系通常通过外键关联来实现。在一的一方,使用@OneToMany注解来定义一对多关系,同时使用@JoinColumn注解指定外键属性。在多的一方,使用@ManyToOne注解来定义多对一关系,并使用@JoinColumn注解指定外键属性。 多对多关系:在Hibernate中,多对多关系通常通过中间表来实现。在多对多的两个实体中,使用@ManyToMany注解来定义多对多关系。同时,需要在中间表中创建两个外键,分别与两个实体的主键关联,并使用@JoinTable注解来指定中间表的表名和两个外键的列名。 总结:通过Hibernate的注解方式,可以方便地实现一对一、一对多和多对多关系映射。通过合理地使用注解,可以减少编写映射文件的工作量,提高开发效率。同时,Hibernate还提供了在运行时自动生成表结构的功能,可以根据Java实体类来动态创建或更新对应的数据库表格,从而提高系统的可维护性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值