2016-08-09 36 views
3

通过SO搜索,但看起来像没有类似的案例。spring jpa - 具有相同标识符值的不同对象已与会话相关联

有一个实体的国家,单场:

public class Country { 

    @Id 
    @Column(name = "COUNTRY_CODE") 
    private String countryCode; 

    public boolean equals(Object o) {} 

    public int hashCode() { } 
} 

而另一类具有这些条目的集合:

public class Product { 

    @ManyToOne(fetch = EAGER, cascade = ALL) 
    @JoinColumn(name = "COUNTRY_CODE") 
    private Country country; 
} 

当通过设置国家:

product.setCountry(new Country("lv")) 

我认为只要它存在就会被保存。

而是我得到一个异常 - 用同样的标识值不同的对象已经与会议

+0

你可以显示堆栈跟踪吗? – ryekayo

回答

8

相关通过观察尽可能多的代码,你已经提供了这个类型的问题就来了,因为对象不是指相同的Java对象实例。当您使用相同的会话对象进行读取时,会发生这种情况&写入或者如果您将同一个对象放入单个会话中。他们指的是数据库中的同一行(即相同的主键),但它们是它的不同副本。所以发生的事情是管理实体的会话将跟踪哪个Java对象对应于具有相同主键的行。

我会建议你尝试下面给出的代码。

1- Just set cascade to MERGE, that should work for you. 

     OR 

2- @GeneratedValue(strategy = GenerationType.SEQUENCE) OR Other GenerationType 
+1

这工作 - @ManyToOne(cascade = {PERSIST,MERGE}) – sandris

相关问题