Spring Data JPA实体的生命周期总结

参考链接

四种状态

首先以一张图,简单介绍写实体生命周期中四种状态之间的转换关系:

jpa-entity

瞬时(New):瞬时对象,刚New出来的对象,无id,还未和持久化上下文(Persistence Context)建立关联。

托管(Managed):托管对象,有id,已和持久化上下文(Persistence Context)建立关联,对象属性的所有改动均会影响到数据库中对应记录。

瞬时对象调用em.persist()方法之后,对象由瞬时状态转换为托管状态

通过find、get、query等方法,查询出来的对象为托管状态

游离状态的对象调用em.merge方法,对象由游离状态转换为托管状态

游离(Datached):游离对象,有id值,但没有和持久化上下文(Persistence Context)建立关联。

托管状态对象提交事务之后,对象状态由托管状态转换为游离状态

托管状态对象调用em.clear()方法之后,对象状态由托管状态转换为游离状态

New出来的对象,id赋值之后,也为游离状态

删除(Removed):执行删除方法(em.remove())但未提交事务的对象,有id值,没有和持久化上下文(Persistence Context)建立关联,即将从数据库中删除。

API示例

针对JPA规范的四个方法,写了一个简单的Demo,进行了一一的验证,以下进行验证过程说明,完整代码传送门:https://github.com/hdlxt/SpringDataJpaDemo.git

整体结构如下:

com.example.demo.controller

persist

不同状态下执行em.persist()方法产生结果:

瞬时态:转化为托管态

托管态:不发生改变,但执行instert语句

删除态:转化为托管态

游离态:抛异常

验证删除态和游离态持久化如下:

1.持久化删除态

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  /**
* 持久化删除态的对象
*@param id
* @return
*/
@RequestMapping("/persistRemove/{id}")
public String persistRemove(@PathVariable("id")Long id){
try {
User user = userDao.findById(id);
userDao.persistRemove(user);
}catch (Exception e){
logger.error("持久化一个删除态的对象!",e);
return REPONSE_ERR;
}
return REPONSE_SUCCESS;
}
--------------------------------------------------------
/**
* 持久化删除态的对象
*
* @param user
*/
@Override
public void persistRemove(User user) {
remove(user);
persist(user);
user.setName("persist remove success!");
}
 

步骤

:8080/user/persisNew/lxt/001,插入一条数据

:8080/user/list,检查插入结果,并获取`id`

:8080/user/persistRemove/{id} ,返回SUCCESS!

:8080/user/list 查看结果

结果:结果数据并未删除,而且name由lxt变为persist remove success!

2.持久化游离态

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  /**
* 持久化游离态的对象
*@param id
* @return
*/
@RequestMapping("/persisDetached/{id}")
public String persisDetached(@PathVariable("id")Long id){
try {
User user = userDao.findById(id);
userDao.clear();
userDao.persist(user);
}catch (Exception e){
logger.error("持久化一个游离态的对象!",e);
return REPONSE_ERR;
}
return REPONSE_SUCCESS;
}
 

步骤

:8080/user/list,获取`id`

:8080/user/persisDetached/{id} 返回ERROR!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwdjzd.html