jpa实体状态及举例
JPA实体有4种状态,1)新建态 2) 托管态 3)游离态 4)删除态
通过代码分别介绍这4种状态(该文基于JPA入门)
- 新建态(没有主键,不与持久化上下文关联)即new 出的对象(但不能指定id的值,若指定则是游离态而非新建态)
- 托管态(有主键,和持久化上下文关联,数据中有对应记录,不可持久化)
- 游离态(有主键,未和持久化上下文关联)
-
删除态(有主键,未持久化上下文关联,数据中有对应记录,可以持久化)(可能理解有偏差,仅供参考)
四种状态的转换图如下:
其中删除态是否在持久化上下中存在些争议,通过代码验证(基于jpa 入门):@Test public void testPersistent() { EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("mysqljpa"); EntityManager entityManager = entityManagerFactory.createEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); Person person = entityManager.find(Person.class, 1); System.out.println(entityManager.contains(person));//判断是否在持久化上下文中 entityManager.remove(person); System.out.println(entityManager.contains(person));//判断是否在持久化上下文中 transaction.commit(); entityManager.close(); entityManagerFactory.close(); }
运行结果:
调用remove 方法后,contains返回false,说明未在持久化上下文中。由于此时事务未提交,且没有调用flush方法,还没有执行delete 语句。Hibernate: select person0_.id as id1_0_0_, person0_.name as name2_0_0_ from tb_person person0_ where person0_.id=? true false Hibernate: delete from tb_person where id=?