jpa 定义中间表实体_Spring Data JPA实体详解

本文详细介绍了Spring Data JPA中实体管理器的工作原理,包括实体的四种状态及其转换,以及persist、merge、clear、remove等方法的应用。此外,还探讨了JPA实体的基础映射,如表映射、主键映射、字段映射和约束条件,以及单实体多表格存储的实现。最后,讨论了实体的高级映射,如一对一、一对多、多对多映射,以及级联策略和懒加载的使用。
摘要由CSDN通过智能技术生成

1. Spring Data JPA实体概述

JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系数据库的映射,此类Java对象称为JPA实体或简称实体。实体通常与底层数据库中的单个关系表相关联,每个实体的实例表示数据库表格中的某一行。

2. Spring Data JPA实体管理器

2.1 实体管理器概述

实体管理器(EntityManager)用于管理系统中的实体,它是实体与数据库之间的桥梁,通过调用实体管理器的相关方法可以把实体持久化到数据库中,同时也可以把数据库中的记录打包成实体对象。

2.2 实体管理器的常用方法

2.2.1 实体的四种状态

在此之前我们要先了解实体的状态及其转换,见下图

JPA实体生命周期有四种状态

新建状态(New):对象在保存进数据库之前为临时状态。此时数据库中没有该对象的信息,该对象的ID属性也为空。如果没有被持久化,程序退出时临时状态的对象信息将丢失。

托管状态(Managed):对象在保存进数据库后或者从数据库中加载后、并且没有脱离Session时为持久化状态。这时候数据库中有对象的信息,改对象的id为数据库中对应记录的主键值。由于还在Session中,持久化状态的对象可以执行任何有关数据库的操作,例如获取集合属性的值等。

游离状态(Datached):是对象曾经处于持久化状态、但是现在已经离开Session了。虽然分离状态的对象有id值,有对应的数据库记录,但是已经无法执行有关数据库的操作。例如,读取延迟加载的集合属性,可能会抛出延迟加载异常。

删除状态(Removed):删除的对象,有id值,尚且和Persistence Context有关联,但是已经准备好从数据库中删除。

状态名

作为java对象存在

在实体管理器中存在

在数据库存在

New

Y

N

N

Managed

Y

Y

Y

Datached

N

N

N

Removed

Y

Y

N

用一段程序来示范

@Transactionalpublic voidsave(){//New 状态

Task t = newTask();

t.setTaskName("task" + newDate().getTime());

t.setCreateTime(newDate());//Managed状态

em.persist(t); //实体类t已经有id t.getId();

t.setTaskName("kkk"); //更新任务名称,这时,如果提交事务,则直接将kkk更新到数据库//Detached状态 事务提交或者调用em.clear都直接将实体任务状态变为Detached

em.clear();

t.setTaskName("kkk"); //更新数据不会更新到数据库//Removed状态

em.remove(t);

}

2.2.2  实体管理器的常用方法

对应于实体的四种状态,实体管理器有四种常用的方法,分别是:persist / merge / clear / remove,结合状态图,可以判断,对于不同状态下的实体,各个方法操作结果会有不同:

对于不同状态下的实体,persist 操作结果如下:

新建状态:实体状态迁移到托管状态

托管状态:实体状态不发生改变,但会执行数据库的insert操作

游离状态:方法的调用将会抛出异常信息

删除状态:实体将重返托管状态

对于不同状态下的实体,merge操作结果如下:

新建状态:系统会执行数据库insert操作,同时返回一个托管状态的实体

托管状态:实体状态不发生改变

游离状态:系统将实体的修改保存到数据库,同时返会一个托管状态的实体

删除状态:方法调用将抛出异常

对于不同状态下的实体,refresh 操作结果如下:

新建状态:系统会执行数据库insert操作,同时返回一个托管状态的实体

托管状态:实体状态不发生改变,但会执行数据库的update操作

游离状态:实体状态将返回托管状态

删除状态:方法调用将抛出异常

对于不同状态下的实体,remove 操作结果如下:

新建状态:方法调用将抛出异常

托管状态:实体状态变成删除状态

分离状态:方法调用将抛出异常

删除状态:不发生任何操作

2.2.3 利用实体管理器管理实体(实现实体的CURD)

public classUserRepositoryImpl {

@PersistenceContextprivateEntityManager entityManager;

@Transactionalpublic voidadd(User user) {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值