根据我的理解,我已经完成了分离和附加的实体
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();
答案 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正在做什么。