为什么将独立实体视为瞬态?

时间:2019-01-26 12:18:41

标签: java hibernate jpa

我正在使用Hibernate作为JPA提供程序。我已经从数据库中获取了account实体,并detached了。因此,帐户实体现在必须处于分离状态。 现在,当我尝试persist分离的实体时,我期望它会失败,因为entitymananger.persist方法仅适用于transientmanaged实体。 但是它正在数据库上运行INSERT查询。

进一步调试entitymananger.persist实现时,我发现它正在将帐户实体视为TRANSIENT。我放置了断点here来查看实体状态

用于测试的代码:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainApplication.class)
public class HibernateTest {

    @PersistenceContext
    private EntityManager entityManager;

    @Test
    @Transactional
    @Commit
    public void testDetached() {
        Account account = entityManager.find(Account.class, 1); // account is now managed entity
        entityManager.detach(account); // detach the account entity
        entityManager.persist(account);// entityManager is treating account as transient object and ran INSERT query on the database

    }

}

添加帐户类别

@Entity
@lombok.Data
@Table(name = "account")
class Account {

    @Id
    @Column(name = "userid")
    private int userid;

    @Column(name = "balance")
    private int balance;

}

我的问题是:

  1. 为什么entitymanager.persistdetached实体视为transient
  2. 我尝试了解Hibernate对某个实体是transient还是detachedcode)的确定。逻辑很复杂,无法内部解释为什么这样做。

如果您需要更多详细信息,请告诉我。谢谢。

1 个答案:

答案 0 :(得分:3)

如果满足以下条件,则认为该实体已分离:

1. ID is not null (otherwise it is transient)
2. It is not managed
3. It has not been removed

我不确定您是如何分配ID属性的,但是我想问题出在那儿。

让ID生成进入休眠状态:

    @Id
    @GeneratedValue  <<<<<<<
    @Column(name = "userid")
    private int userid;

那应该使测试失败。