我正在使用Hibernate作为JPA提供程序。我已经从数据库中获取了account
实体,并detached
了。因此,帐户实体现在必须处于分离状态。
现在,当我尝试persist
分离的实体时,我期望它会失败,因为entitymananger.persist
方法仅适用于transient
和managed
实体。 但是它正在数据库上运行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;
}
我的问题是:
entitymanager.persist
将detached
实体视为transient
?transient
还是detached
(code)的确定。逻辑很复杂,无法内部解释为什么这样做。如果您需要更多详细信息,请告诉我。谢谢。
答案 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;
那应该使测试失败。