2016-08-09 2 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. Это может произойти, если вы использовали тот же объект сеанса для чтения & write Или если вы помещаете один и тот же объект в один сеанс. Они относятся к одной и той же строке в базе данных (т. Е. К одному и тому же первичному ключу), но они представляют собой разные копии этого. Так что происходит то, что сеанс, который управляет сущностями, будет отслеживать, какой 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

Смежные вопросы

 Смежные вопросы