JPA持久对象的状态
1为什么要学习持久对象的状态
JPA持久对象的状态对我们来说非常非常重要,
主要是我们用的时候,遇到异常、问题的时候,都需要通过状态来分析,才知道这到底是为什么?是什么原因出现这种情况?怎样才可以正确使用JPA
临时状态(transient):瞬时状态
刚刚用new语句创建,没有和entityManager发生关系
没有被持久化,不处于entityManager中。该对象成为临时对象
持久化状态(persistent):托管状态
和entityManager发生关系
已经被持久化,加入到entityManager的一级缓存中(填充一级缓存)。
该状态的对象为持久化对象。
@Test
public
void save() throws Exception {
StateDomain stateDomain = new
StateDomain();// 临时状态
stateDomain.setName("itsource");// 临时状态
EntityManager entityManager =
JPAUtils.getEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(stateDomain);// 持久状态
entityManager.getTransaction().commit();
entityManager.close();// 游离状态
}
游离状态(detached):脱管状态
已经被持久化,但不处于entityManager中。
该状态的对象为游离对象。
删除状态(removed):从JPA才开始有的状态
只有调用了entityManager.remove(domain对象)方法
对象有关联的ID,并且在entityManager管理下,
但是已经被计划删除,事务提交就真的被删除了。
脏数据更新
一个持久状态对象在事务管理内,如果改变原来的数据(非主键),此时出现脏数据,在事务提交的时候自动发出update语句去修改
@Test
public void update() throws Exception {
save();
EntityManager entityManager =JPAUtils.getEntityManager();
entityManager.getTransaction().begin();
S