JPA 实体生命周期理解和总结

先来一个图

JPA 实体生命周期理解和总结_第1张图片

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

  1. New:瞬时对象,尚未有id,还未和Persistence Context建立关联的对象。

  2. Managed:持久化受管对象,有id值,已经和Persistence Context建立了关联的对象。

  3. Datached:游离态离线对象,有id值,但没有和Persistence Context建立关联的对象。

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

Managed状态下的数据保存,更新以及删除数据下的Removed状态,数据都不会立即更新到数据库,只有当你事务提交或者em.flush(),才会立即更新到数据库。

Datached的状态,可以调用em.merge()方法,这个方法会根据实体类的id来更新数据库数据,这时实体类变成了Managed状态。

四种状态总结:

状态名 作为java对象存在 在实体管理器中存在 在数据库存在

New yes no no

Managed yes yes yes

Detached no no no

Removed yes yes no

@Transactional
public void save(){

    //New 状态
    Task t = new Task();
    t.setTaskName("task" + new Date().getTime());
    t.setCreateTime(new Date());

    //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);
}

你可能感兴趣的:(jpa)