Hibernate之表与表映射关系

1、单向多对一关系映射

  1. 创建两个entity,分别为Student和Grade
    在这里插入图片描述
    在这里插入图片描述
  2. 创建两张表的映射文件
    在这里插入图片描述
    在这里插入图片描述
  3. 在hibernate的配置文件中添加对象映射文件
    在这里插入图片描述
  4. 往表中插入数据
    在这里插入图片描述
    因为我们在配置文件中设置了hbm2ddl.auto为update他会自动为我们创建表并创建好约束。当我们第一次往数据库里插入数据的时候,检测到数据库中没有对应的表,那么就会先创建表在插入数据。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  5. 查询数据库中student
    在这里插入图片描述
    会自动将对应的grade的数据也查询出来

2、单向一对多

  1. 在Grade实体类中添加一个set集合
    在这里插入图片描述
  2. 修改Grade的映射文件 在这里插入图片描述
  3. 在测试类中进行插入测试
    在这里插入图片描述
    在这里插入图片描述
    4.在测试类中查询
    在这里插入图片描述
    在这里插入图片描述

3、双向一对多

即一那一边中有多那一边的set,多那一边有一那边的对象。注意二者的配置文件中的关联字段的not—null应该去掉。否则会出现问题。双向的意义就是单向一对多和单向多对一的方法都可以像数据库中插入数据。

4. 级联操作cascade

在双向一对多的学习中,我们发现每次保存对象时,学生对象和年级对象都需要我们持久化到session,既然它们两者有关联关系,可不可以只持久化其中一端,另一端就会自动的被持久化呢,这个属性就是Hibernate的cascade。cascade是多对一、一对多、一对一、多对多各种关系之间的一种级联操作行为。
none:不级联
save-update:保存和更新某一端数据时,另一端的数据可以一起保存和更新
delete:删除的级联 不能在多的一端使用
all:表示所有操作都级联

在工作当中:
在多对一的关系中,多的一端不能操作级联为delete。一般在多的一端设为save-update。
在一对多的关系中,如果一的一端设为delete相关配置时,多的一端不能指明外建为非空

什么是级联

官方解释:必须级联到关联目标的操作,默认情况下没有级联操作。
当Hibernate持久化一个瞬时对象时,在默认情况下,它不会自动持久化所关联的其他临时对象,而是会抛出TransientObjectException
级联的意思是:本实体做了什么事,也要拉上另一个关联的实体,导致另一个实体跟着做事情。就是说我删除了,你也得删除!关联目标,指的是关联的那个实体。

在哪里配置级联呢?

在两个表的关联部分配置cascade属性

  • 在Grade的映射文件的set上面配置级联,表示当我们插入Grade的时候,如果有对应的student数据,则一起插入,无需一遍遍执行session.save(student)
    在这里插入图片描述
    在这里插入图片描述

  • 在Student的映射文件的many-to-one标签中设置cascade属性,表示当插入student的时候如果有对应的grade,也会级联插入
    在这里插入图片描述

5、维护关系inverse

在双向一对多的学习中,我们总结出维护关系方由多端维护时效率较高,因为DML语句会少执行Update语句,那么为了提高程序效率,我们一般都是将关系维护方设置为多端,这个属性就是Hibernate的inverse。invserse的值是boolean值,该属性只能在一端设置。

什么是维护关系

如果一端的映射文件设置为true,说明映射关系(一对多,多对多等)中让对方来维护关系。如果为false。双方都可以维护关系,默认值是false,并且比如一对多,这个一端,也就是在有集合的这端设置。
维护关系:维护什么关系呢?维护外键的关系,上面已经提到,由多端维护,效率较高
在这里插入图片描述
当这里设置了inverse以后,我们只能使用多对一去插入数据,如果使用一对多去插入数据,无法为student表的grade_id字段插入值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate 的核心功能之一是 Java 对象和数据库之间的映射,这是实现 ORM 的核心。Hibernate 提供了多种方式来进行对象和之间的映射,包括 XML 映射文件、注解和 Java 代码映射等。无论使用哪种方式,Hibernate映射原理都是一致的。 Hibernate映射原理可以分为两个方面:对象属性和列之间的映射、对象之间的关系映射。 1. 对象属性和列之间的映射Hibernate 中,每个实体类都对应着一个数据库,实体类的属性对应着数据库的列。在使用 Hibernate 进行数据库操作时,Hibernate 会将实体对象的属性值映射数据库的列上,或将数据库的列值映射到实体对象的属性上。Hibernate 的属性和列之间的映射关系主要通过映射文件或注解来进行配置。 在映射文件中,使用 <class> 标签定义实体类,使用 <property> 标签或 <id> 标签来定义属性,使用 <column> 标签来定义属性对应的数据库列。例如: ```xml <class name="com.example.User" table="user"> <id name="id" type="long" column="id"> <generator class="identity"/> </id> <property name="name" column="name" type="string"/> <property name="age" column="age" type="integer"/> </class> ``` 在注解中,使用 @Entity 标注实体类,使用 @Column 标注属性对应的数据库列。例如: ```java @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "age") private Integer age; // 省略 getter 和 setter 方法 } ``` 2. 对象之间的关系映射Hibernate 中,实体类之间可以存在多种关系,包括一对一、一对多、多对一和多对多等。Hibernate 通过映射文件或注解来定义实体类之间的关系映射关系。 例如,一对多关系可以通过在多的一方的实体类中定义一个集合属性来示。在映射文件中,使用 <set> 标签定义集合属性,使用 <one-to-many> 标签定义集合元素对应的实体类。例如: ```xml <class name="com.example.Order" table="orders"> <id name="id" type="long" column="id"> <generator class="identity"/> </id> <property name="name" column="name" type="string"/> <set name="items" inverse="true" lazy="true" cascade="all"> <key column="order_id"/> <one-to-many class="com.example.OrderItem"/> </set> </class> <class name="com.example.OrderItem" table="order_items"> <id name="id" type="long" column="id"> <generator class="identity"/> </id> <property name="name" column="name" type="string"/> <property name="price" column="price" type="double"/> <many-to-one name="order" class="com.example.Order" column="order_id"/> </class> ``` 在注解中,可以使用 @OneToMany 和 @ManyToOne 注解来定义一对多关系,使用 @JoinColumn 注解来定义外键。例如: ```java @Entity @Table(name = "orders") public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> items; // 省略 getter 和 setter 方法 } @Entity @Table(name = "order_items") public class OrderItem { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "price") private Double price; @ManyToOne @JoinColumn(name = "order_id") private Order order; // 省略 getter 和 setter 方法 } ``` 总之,Hibernate映射原理是将 Java 对象和数据库之间的属性和关系进行映射,通过映射文件或注解来进行配置。Hibernate 支持多种关系映射,包括一对一、一对多、多对一和多对多等,开发人员可以根据需要选择合适的映射方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值