2017-04-25 51 views
-1

相关联的I具有以下面的方式与两个彼此对象:休眠更新例外:一个不同的对象使用相同的标识符值已经与会话

Item.java

@Entity 
@Table(name = "item") 
public class Item { 

@Id 
@GeneratedValue 
@Column(name = "id") 
private Long id; 
@OneToMany(fetch = FetchType.LAZY, mappedBy = "item", cascade=CascadeType.ALL) 
     private Set<ItemConfiguration> ItemSettings = new HashSet<ItemSettings>(); 
    } 

ItemSetting。 Java的

@Entity 
@Table(name = "item_setting") 
public class ItemSetting { 
@Id 
@GeneratedValue 
@Column(name = "id") 
private Long id; 

@Column(name = "type") 
private String type; 

@Column(name = "value") 
private String value; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "item_id", nullable = false) 
private Item item; 
} 

我试图更新由以下语句的顺序设置:

ItemSettings settings = item.getSettingByType(type); // returns one of the settings that has matching type 

settings.setValue("new value"); 
this.itemDAO.updateItem(item); 

这将导致一个例外:

不同的对象有同样的标识值已经 与会话

我不明白为什么会发生相关。我不是多次从数据库加载相同的setting。方法item.getSettingByType(type)通过遍历与项目关联的一组设置来获取setting

+0

如果您想用于帮助您,可能会添加更多详细信息和代码,因为此时需要更多。 – Zorglube

+0

您可以尝试在这里接受的答案:http://stackoverflow.com/questions/3609653/hibernate-error-org-hibernate-nonuniqueobjectexception-a-different-object-with?answertab=active#tab-top –

回答

0

很可能是因为Item对象没有引用相同的Java ItemSetting对象实例。它们指的是数据库中的同一行(即相同的主键),但它们是不同的副本。

因此,发生的事情是管理实体的Hibernate会话将跟踪哪个Java对象与具有相同主键的行对应。

一个选项是确保引用同一行的对象项的实体实际上是指同一个对象实例的ItemSetting。或者关闭该成员变量的级联。当项目被持久化时,ItemSetting不是。不过,您必须手动分别手动保存ItemSetting。如果ItemSetting是一个类型/类别表,那么这样做可能是有意义的。

+0

这怎么可能当我没有itemSetting对象的两个副本时会发生? – user3552551

+0

当我没有itemSetting对象的两个副本时,会发生这种情况?有没有一种方法可以查看会话中的对象。我对hibernate非常陌生。 – user3552551

相关问题