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

san*_*ris 4 java spring jpa

通过SO搜索,但看起来没有类似的情况.

有一个实体国家/地区,只有一个字段:

public class Country {

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

    public boolean equals(Object o) {}

    public int hashCode() { }
}
Run Code Online (Sandbox Code Playgroud)

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

public class Product {

    @ManyToOne(fetch = EAGER, cascade = ALL)
    @JoinColumn(name = "COUNTRY_CODE")
    private Country country;
}
Run Code Online (Sandbox Code Playgroud)

设置国家/地区时:

product.setCountry(new Country("lv"))
Run Code Online (Sandbox Code Playgroud)

我假设它会被保存,如果存在的话.

但是我得到了一个例外 - 具有相同标识符值的不同对象已经与会话相关联

Gok*_*kul 15

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

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

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

       OR

2- @GeneratedValue(strategy = GenerationType.SEQUENCE)   OR Other GenerationType 
Run Code Online (Sandbox Code Playgroud)