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实现有关。
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异常。
refresh方法可以保证当前的实例与数据库中的实例的内容一致。
对不同状态下的实例A,refresh会产生以下操作:
1. 如果A是一个new状态的实例,不会发生任何操作,但有可能会抛出异常,具体情况根据不同JPA实现有关;
2. 如果A是一个managed状态的实例,它的属性将会和数据库中的数据同步;
3. 如果A是一个removed状态的实例,不会发生任何操作;
4. 如果A是一个detached状态的实体,该方法将会抛出异常。
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对象
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对象
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- 模拟Spring的简单实现
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- struts2 spring整合fieldError问题
- spring的jdbctemplate的crud的基类dao
- 读取spring配置文件的方法(spring读取资源文件)
- java实现简单美女拼图游戏
- java基本教程之线程休眠 java多线程教程
- JSP开发中在spring mvc项目中实现登录账号单浏览器登录
- spring boot实战之内嵌容器tomcat配置
- 基于Spring框架的Shiro配置方法
- Spring MVC中上传文件实例
- spring aop两种配置方式
- 实例讲解Java的Spring框架中的AOP实现
- 解析Java中如何获取Spring中配置的bean
- Spring的注解配置与XML配置之间的比较
- java Spring整合Freemarker的详细步骤