2016-05-02 3 views
0

Моих классов выглядят simiar на это: (Предложение класс)Hibernate сохраняющегося Набор @Embeddable объектов бросает исключение

@Entity 
public class Offer { 
    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private int id; 
    @ElementCollection(fetch = FetchType.LAZY) 
    private Set<Product> products; 

    ...other fields 
} 

и товары класс:

@Embeddable 
public class Product { 
    private String name; 
    private String description; 
    private int amount; 
} 

Проблема при попытке сохраняться Предлагаем организацию и попытаться добавить два объекта Оферты Set:

Product product = new Product("ham", "description1", 1); 
Product product = new Product("cheese", "description2", 1); 

я получаю исключение:

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "offer_products_pkey" 
    Details: Key (offer_id, amount)=(1, 1) already exists. 

Я понятия не имею, почему я не могу сохранить два встраиваемых объекта в Set, когда одно из них имеет то же значение поля «сумма»? Является ли это как идентификатор каким-то образом?

Возможно, мне не следует создавать список встраиваемых объектов, так как он не предназначен для использования таким образом? Если да, то что, если мне не нужна компания Product, но вы хотите сохранить ее в другом объекте (предложение)?

Заранее спасибо за помощь

+1

Возможно, вы неправильно определили ключ в таблице продуктов. Исключение ясное – mariusz2108

+0

У меня нет ключевой переменной в объекте Product. Если я использую List вместо Set, он работает нормально, но для Set его нет. Проблема, похоже, связана с особенностями интерфейса Set - она ​​не может содержать дубликатов. Но почему поле «количество» рассматривается как дубликат? – azalut

+0

Ошибка возникает из PostgreSQL. Он сообщает вам, что не так: вы определили, что выглядит как первичный ключ с именем offer_products_pkey для (offer_ид, количество). И вы пытаетесь вставить две строки с одним и тем же основным ключом. снимите это ограничение первичного ключа, если оно не должно существовать. –

ответ

0

Этот вопрос при использовании Set является то, что содержание должно быть уникальным, так как это определение Set. Поставщик JPA попытается обеспечить это с помощью ограничения базы данных. В вашем примере он добавляет ограничение в виде Primary KeyOffer_id и int Amount, хотя IMHO он должен добавить ограничение для всех значений Product. Лучший способ увидеть это для того, чтобы журналы SQL и посмотреть, что происходит под одеялом:

Hibernate: create table Offer (id integer not null, primary key (id)) 
Hibernate: create table Offer_products (Offer_id integer not null, amount integer not null, description varchar(255), name varchar(255), primary key (Offer_id, amount)) 
Hibernate: alter table Offer_products add constraint FKmveai2l6gf4n38tuhcddby3tv foreign key (Offer_id) references Offer 

способ исправить это сделать products свойство Offer в List вместо Set:

Hibernate: create table Offer (id integer not null, primary key (id)) 
Hibernate: create table Offer_products (Offer_id integer not null, amount integer not null, description varchar(255), name varchar(255)) 
Hibernate: alter table Offer_products add constraint FKmveai2l6gf4n38tuhcddby3tv foreign key (Offer_id) references Offer 
Смежные вопросы