java - 为什么分离实体被视为 transient ?

标签 java hibernate jpa

我使用 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;

}

我的问题是:

  1. 为什么entitymanager.persist分离实体视为 transient
  2. 我尝试了解 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/

相关文章:

mysql - 事务回滚在 karaf 中不起作用

java - Spring + JPA 事务已创建并提交,但数据库中没有结果

Java Spring - 仅保存(POST)来自 ManyToOne 关系的 id

java - 需要一个基于 Java 的 HTML 美化器来清理 Velocity 生成的 HTML

java - 是否可以使用单个 hibernate session 将对象保存在两个不同的模式中?

java - Servlet 以 HTML 而不是 JSON 的形式返回响应

java - 静态元模型主键属性未填充(NullPointerException)

java - 以当前时间为条件处理单元测试

java - SQL/Hibernate 标准 - 按故障分组

java - 如果服务器返回 502 错误,如何读取 HTTP 响应?