通过SO搜索,但看起来没有类似的案例。
有一个实体国家/地区,只有一个字段:
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 :(得分:14)
通过查看您提供的代码数量,这类问题的出现是因为对象不是指同一个Java对象实例。当您使用相同的会话对象进行读取时,可能会发生这种情况。写或如果您在单个会话中放置相同的对象。它们指的是数据库中的同一行(即相同的主键),但它们是它的不同副本。所发生的事情是管理实体的会话将跟踪哪个Java对象对应于具有相同主键的行。
我建议你尝试下面给出的代码。
1- Just set cascade to MERGE, that should work for you.
OR
2- @GeneratedValue(strategy = GenerationType.SEQUENCE) OR Other GenerationType