合并在JPA Hibernate中失败但在同一事务中PERSIST有效

时间:2016-02-01 05:57:43

标签: hibernate jpa merge persistence persist

  

根据我的理解,我已经完成了分离和附加的实体

User user=entityManager.find(User.class,1);

此处用户是附加实体,对此的任何更改都将反映在数据库中

  

分离实体是新创建的实体,您可以使用合并而不是以下列方式保留@

 User userDetached=new User;
 user.setID(1);
 User userattahed=entityManger.merge(userDetached);
 userattahed.setName("cool");

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

以下是我的代码,其中几次(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();  

2 个答案:

答案 0 :(得分:0)

这条线有点奇怪:

user.setBalance(user.getBalance().add(getAmount()));

这是您实际对用户进行的唯一更改。它有什么作用?什么是平衡,添加什么呢?在某些情况下可能没有任何变化,因此无需存储。

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

另请注意,当您调用merge of persist或类似的内容时,更改不一定会刷新到数据库。它可以在提交时刷新。因此,在决定已刷新的内容之前,请始终将事务运行到最终。

答案 1 :(得分:0)

我遇到了类似的问题,因此持续存在并且合并失败;这是破解的代码示例:

public MyType persistMyType(MyType myType) {
        MyType merge = em.merge(myType);
        em.persist(merge);
        return merge;
}

一旦我删除了合并,我就不再有这个问题了。

PS:MyType是MyParent的一个孩子,它的注释如下:

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

我很高兴我找到了解决办法,但我仍然不知道出了什么问题。我倾向于认为这个问题与脏物有关。 SQL日志记录显示了在持久化之前发生的大量SELECT,这可以让你知道hibernate正在做什么。