Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JPA Hibernate中,合并有时会失败,但在同一事务中,PERSIST可以工作_Hibernate_Jpa_Merge_Persistence_Persist - Fatal编程技术网

在JPA Hibernate中,合并有时会失败,但在同一事务中,PERSIST可以工作

在JPA Hibernate中,合并有时会失败,但在同一事务中,PERSIST可以工作,hibernate,jpa,merge,persistence,persist,Hibernate,Jpa,Merge,Persistence,Persist,根据我的理解,我已经经历了分离和依附的实体 在这里,用户是一个附加的实体,对此所做的任何更改都将反映在数据库中 分离实体是新创建的实体,您可以通过以下方式使用合并而不是持久化@ 这里的名字将反映在数据库中…如果我没有错的话 下面是我的代码,其中有几次(100/10)合并不起作用,而持久化100%起作用 entityManager = JPAUtil.getEntityManager(); UsersModel user=entityManager.

根据我的理解,我已经经历了分离和依附的实体

在这里,用户是一个附加的实体,对此所做的任何更改都将反映在数据库中

分离实体是新创建的实体,您可以通过以下方式使用合并而不是持久化@

这里的名字将反映在数据库中…如果我没有错的话

下面是我的代码,其中有几次(100/10)合并不起作用,而持久化100%起作用

            entityManager = JPAUtil.getEntityManager();
            UsersModel user=entityManager.find(UsersModel.class,getMobile_num());
            TrackModel track=new TracksModel();
            user.setBalance(user.getBalance().add(getAmount()));
            track.setMobile_Num(getMobile_num());
            track.setTransaction_Type(getTransaction_Type());
            track.setAmount(getAmount());
            entityManager.merge(user);//doesn't update few times 
            entityManager.persist(track); //works 100%
            JPAUtil.commit();  

这句话有点奇怪:

user.setBalance(user.getBalance().add(getAmount()));
这是您实际对用户所做的唯一更改。它有什么作用?余额是多少,add用它做什么?在某些情况下可能根本没有变化,因此没有什么可存储的

因为它无论如何都在会话中(它之前已经加载),所以不需要调用任何东西来持久化它。它最迟将在提交时刷新


还要注意的是,当您调用persist of merge或类似的操作时,这些更改不一定会刷新到数据库中。它可能会在提交时刷新。因此,在决定刷新了什么之前,一定要将事务运行到底。

我也遇到过类似的问题,即后续的持久化和合并失败;下面是正在中断的代码示例:

public MyType persistMyType(MyType myType) {
        MyType merge = em.merge(myType);
        em.persist(merge);
        return merge;
}
一旦我删除了merge,我就不再有这个问题了

PS:MyType是MyParent的子级,其注释如下:

@OneToMany(mappedBy="myParent", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)

我很高兴找到了工作,我仍然不知道哪里出了问题。我倾向于认为这个问题与脏东西有关。SQL日志记录显示了在持久化之前发生的大量选择,这可以为您提供hibernate在做什么的线索。

为什么要合并处于“托管”状态的实体?毫无意义,因为更新是“已知的”。@NeilStockton我确实理解你的意思,但它会影响任何东西吗?这意味着你的调用是毫无意义的(就像在不同对象上使用persist一样毫无意义)。如果你想调试你的问题,那么你可以查看你选择的JPA提供者的日志。感谢回复…Balance属性是一个BigDecimal数据类型…我需要将金额(getAmount)添加到用户当前余额中,所以我就像这个用户一样。setBalance(user.getBalance().add(getAmount());可能还是那笔钱是零?如何确定“它是否有效”呢?您可以看到track.setAmount(getAmount());在DB中得到持久化的行…告诉最后一笔交易金额是this track.getAmount
public MyType persistMyType(MyType myType) {
        MyType merge = em.merge(myType);
        em.persist(merge);
        return merge;
}
@OneToMany(mappedBy="myParent", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)