`
hello_world_hello
  • 浏览: 8486 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jpa实体状态及举例

    博客分类:
  • jpa
 
阅读更多

JPA实体有4种状态,1)新建态 2) 托管态 3)游离态 4)删除态

通过代码分别介绍这4种状态(该文基于JPA入门

  1. 新建态(没有主键,不与持久化上下文关联)即new 出的对象(但不能指定id的值,若指定则是游离态而非新建态)
  2. 托管态(有主键,和持久化上下文关联,数据中有对应记录,不可持久化)

  3. 游离态(有主键,未和持久化上下文关联)

  4. 删除态(有主键,未持久化上下文关联,数据中有对应记录,可以持久化)(可能理解有偏差,仅供参考)

    四种状态的转换图如下:




     
     
     
    其中删除态是否在持久化上下中存在些争议,通过代码验证(基于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();
    	}
     
    运行结果:
       
    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=?
     调用remove 方法后,contains返回false,说明未在持久化上下文中。由于此时事务未提交,且没有调用flush方法,还没有执行delete 语句。
  • 大小: 19.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics