Spring Data JPA 自动更新数据

描述:实体对象属于托管状态下时,往这个对象里面的某个属性 set 新的值,这个新的值会被更新到数据表中去。

使用 EntityManager.contains(entity) 方法可以得知某个实体对象是否处于托管状态,也就是说是否处于 persistence context 中。
使用 EntityManager.clear() 方法可以将处于 persistence context 范围中的托管对象变为游离对象,这时重置属性值不会更新到数据表中去。

persistence context 有两种类型。一种称为 transaction-scope persistence context,在这种状态下 persistence context 是与事务相关的,也就是说在事务范围内托管对象所有的更改都会被更新到数据表中去,当事务提交后,这个 persistence context 也就销毁了,之后的更改不会被更新到数据表中去。

另一种称为 extended persistence context,在这种状态下 persistence context 并不会因事务提交而销毁,而是可以跨事务的,具体的销毁与客户端请求有关,一般用于 Stateful Session Bean 中。

一般使用的 persistence context 都是默认的 transaction-scoped,extended 的很少用到。

在 transaction-scoped 环境中,受托管的实体对象并在事务环境中,这时重置属性值会更新到数据表中去。如果实体对象为游离对象,也就是说已经从 persistence context 游离出来了,这时重置属性值不会更新到数据表中去,如果需要将游离对象重置的值更新到数据表中去,需要使用 EntityManager#merge(entity) 方法,将该游离对象纳入当前 persistence context 的管辖之中重新成为托管对象。

@PersistenceContext private EntityManager entityManager;

...{
---省略代码---
ScorePoint scorePoint = scorePointSecDao.findScorePointById(groupId,scorePointId);
if(entityManager.contains(scorePoint)){
logger.info("实体对象属于托管状态下时,往这个对象里面的某个属性 set 新的值,这个新的值会被更新到数据表中去。"

  • "使用 EntityManager#contains(entity) 方法可以得知某个实体对象是否处于托管状态,也就是说是否处于 persistence context 中");
    entityManager.clear();
    logger.info("entityManager.clear()方法被调用,已经被清理");
    }

}

推荐阅读更多精彩内容