spring jpa - 具有相同标识符值的另一个对象已与会话关联

时间:2016-08-09 14:17:39

标签: java spring jpa

通过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"))

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

但我获得了一个异常 - 具有相同标识符值的另一个对象已经与会话

相关联

1 个答案:

答案 0 :(得分:14)

通过查看您提供的代码数量,这类问题的出现是因为对象不是指同一个Java对象实例。当您使用相同的会话对象进行读取时,可能会发生这种情况。写或如果您在单个会话中放置相同的对象。它们指的是数据库中的同一行(即相同的主键),但它们是它的不同副本。所发生的事情是管理实体的会话将跟踪哪个Java对象对应于具有相同主键的行。

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

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

       OR

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