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 语句。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值