【问题标题】:How to prevent hibernate to save same object如何防止休眠保存相同的对象
【发布时间】:2014-03-04 09:05:50
【问题描述】:

我有名为 Country、City 和 People 的表。我可以防止休眠以保存相同的人对象吗?这是我的课程,问题是当我尝试保存国家/地区对象时,Hibernate 尝试按预期保存或更新相同的人员对象。(城市的人员对象和国家/地区的人员对象具有相同的 PK)

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session

类;

class Country{

.....

@JoinColumn(.....)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private City city;


@JoinColumn(.....)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private People people;

}

class City{

....

@JoinColumn(.....)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private People people;

}

这是我的保存方法;

public void save(){

    ....


    getCurrentSession().saveOrUpdate(customer); //Hibernate session


 }

【问题讨论】:

  • 您还可以使用实体发布您的代码吗?

标签: sql hibernate


【解决方案1】:

这里有2个解决方案:

  • 使用merge 而不是save
  • 或删除save 级联注释。

同时使用savesave 级联基本上告诉Hibernate“请保留这个新对象以及他所有的新关系”。你不想这样。

【讨论】:

  • 将 @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) 更改为 @Cascade(org.hibernate.annotations.CascadeType.MERGE) 就足够了吗?我不知道合并的真正作用。
  • 参见stackoverflow.com/questions/170962/… => "如果您尝试更新在某一时刻与会话分离的对象,尤其是当前关联的这些对象可能存在持久实例时,您应该使用 Merge()与会话。否则,在这种情况下使用 SaveOrUpdate() 会导致异常。"
猜你喜欢
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2018-01-11
  • 1970-01-01
  • 2011-08-24
  • 2011-01-17
  • 2012-08-09
相关资源
最近更新 更多