我使用 Hibernate 作为 JPA 提供程序。我已从数据库中获取了 account
实体并对其进行了分离
。因此,帐户实体现在必须处于分离状态。
现在,当我尝试persist
分离的实体时,我预计它会失败,因为entitymananger.persist
方法仅适用于transient
和 >托管
实体。 但它正在数据库上运行 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
将分离
实体视为transient
? - 我尝试了解 Hibernate 确定实体是
transient
还是分离
( code )。逻辑很复杂,无法内化为什么要这样做。
如果您需要更多详细信息,请告诉我。谢谢。
最佳答案
实体在以下情况下被视为分离:
1. ID is not null (otherwise it is transient)
2. It is not managed
3. It has not been removed
我不确定您如何分配 ID 属性,但我猜问题就在那里。
让 ID 生成处于 hibernate 状态:
@Id
@GeneratedValue <<<<<<<
@Column(name = "userid")
private int userid;
这应该会导致测试失败。
关于java - 为什么分离实体被视为 transient ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54378293/