您的位置:首页 > 编程语言 > Java开发

JPA EntityManager的四个主要方法 ——persist,merge,refresh和remove

2015-10-16 17:39 696 查看
对不同状态下的实例A,persist会产生以下操作:

1.       如果A是一个new状态的实体,它将会转为managed状态;

2.       如果A是一个managed状态的实体,它的状态不会发生任何改变。但是系统仍会在数据库执行INSERT操作;

3.       如果A是一个removed(删除)状态的实体,它将会转换为受控状态;

4.       如果A是一个detached(分离)状态的实体,该方法会抛出IllegalArgumentException异常,具体异常根据不同的JPA实现有关。


public void merge(Object entity)

         merge方法的主要作用是将用户对一个detached状态实体的修改进行归档,归档后将产生一个新的managed状态对象。

 

对不同状态下的实例A,merge会产生以下操作:

1.       如果A是一个detached状态的实体,该方法会将A的修改提交到数据库,并返回一个新的managed状态的实例A2;

2.       如果A是一个new状态的实体,该方法会产生一个根据A产生的managed状态实体A2;

3.       如果A是一个managed状态的实体,它的状态不会发生任何改变。但是系统仍会在数据库执行UPDATE操作;

4.       如果A是一个removed状态的实体,该方法会抛出IllegalArgumentException异常。


public void refresh(Object entity)

        refresh方法可以保证当前的实例与数据库中的实例的内容一致。

 

对不同状态下的实例A,refresh会产生以下操作:

1.       如果A是一个new状态的实例,不会发生任何操作,但有可能会抛出异常,具体情况根据不同JPA实现有关;

2.       如果A是一个managed状态的实例,它的属性将会和数据库中的数据同步;

3.       如果A是一个removed状态的实例,不会发生任何操作;

4.       如果A是一个detached状态的实体,该方法将会抛出异常。


public void remove(Object entity)

        remove方法可以将实体转换为removed状态,并且在调用flush()方法或提交事物后删除数据库中的数据。

 

对不同状态下的实例A,remove会产生以下操作:

1.       如果A是一个new状态的实例,A的状态不会发生任何改变,但系统仍会在数据库中执行DELETE语句;

2.       如果A是一个managed状态的实例,它的状态会转换为removed;

3.       如果A是一个removed状态的实例,不会发生任何操作;

4.       如果A是一个detached状态的实体,该方法将会抛出异常。

实体的生命周期:新实体(new),持久化态(managed),游离态(detached),删除状态(removed)

EntityManger控制实体在四个状态之间转换

 





 





 

1、void persist(t entity)

    调用persist,新实体状态(new)转化为持久化状态(managed),如果实体已经被持久化,则调用persist方法不会发生任何事情,如果对于一个删除状态的实体调用persist方法,则删除态的实体又转变为持久化态,如果对于一个游离态(detached)的实体执行persist操作,则抛出IllegalArgumentException异常。

    对一个实体执行persist操作,将广播到实体关联的实体上,执行级联化操作。

 

2、void remove(t entity)

    通过调用remove方法删除一个持久化态的实体。如果实体声明为级联删除,则相关联的实体也被删除。

    在一个新实体状态(new)的实体上调用remove操作,将被忽略。

    在游离态的实体上调用remove操作,将抛出IllegalArgumentException异常。

    在删除态的实体上调用remove操作,将被忽略。

 

3、void flush()

    将持久化态的实体数据同步到数据库中。

 

4、<T> T merge(T entity)

    将游离态的实体持久化到数据库中,并转换为持久化态。

    如果A是一个游离态的实体,该方法会将A的修改提交到数据库,并产生一个Managed态的实例A2

    如果A是一个new态的实体,该方法会根据A产生一个managed态的实体A2

    如果A是一个managed态的实体,它的状态不会改变,但是系统仍然会在数据库执行UPDATE操作。

    如果A是remove态的实体,该方法会抛出IllegalArgumentException异常

 

5、void refresh(T entity)

    该方法保证当前的实例与数据库中的实例内容一致。

    如果A是一个new态的实体,该方法不会发生任何操作。

    如果A是一个managed态的实体,它的属性将与数据库中的数据同步。

    如果A是remove态的实体,该方法不会发生任何操作

    如果A是detached态的实体,该方法抛出异常。

6、<T> T find(Class<T> entityClass,Object primaryKey)

    以主键查询实体对象,entityClass是实体的类,primaryKey是主键值,如以下的代码查询Topic实体: 

    Topic t = em.find(Topic.class,1);

7、 Query createQuery(String qlString)

    根据JPA的查询语句创建一个查询对象Query

8、Query createNativeQuery(String sqlString)

    使用本地数据库的sql语句创建一个query对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring JPA