2016-05-02 9 views
0

Meine Klassen simiar aussehen: (Angebot Klasse)Hibernate persistierenden Set @Embeddable Objekte wirft Ausnahme

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

    ...other fields 
} 

und Produktklasse:

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

Das Problem ist, wenn ich versuche, die bestehen bleiben Verschenken Einheit und versuchen, zwei Objekte hinzufügen bieten das Set:

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

I Ausnahme erhalten:

Ich habe keine Ahnung, warum kann ich nicht zwei eingebettete Objekte im Set beibehalten, wenn einer von ihnen den gleichen Wert von "Menge" Feld hat? Wird es irgendwie als ID behandelt?

Vielleicht sollte ich keine Liste einbettbarer Objekte erstellen, da sie nicht dafür gedacht ist, so verwendet zu werden? Wenn ja - was dann, wenn ich keine Entität des Produkts benötige, sie aber in einer anderen Entität (Angebot) behalten möchte?

Vielen Dank im Voraus für die Hilfe

+1

Sie haben wahrscheinlich falsch definierten Schlüssel in der Tabelle Produkte. Ausnahme ist klar – mariusz2108

+0

Ich habe keine Schlüsselvariable in Produktobjekt. Wenn ich List statt Set verwende, funktioniert es gut, aber für Set tut es nicht. Das Problem scheint mit den Features der Set-Schnittstelle verbunden zu sein - es darf keine Duplikate enthalten. Aber warum wird Feld "Betrag" als doppelt behandelt? – azalut

+0

Der Fehler kommt von PostgreSQL. Es sagt Ihnen, was falsch ist: Sie haben definiert, was wie ein Primärschlüssel namens offer_products_pkey für (offer_id, amount) aussieht. Und Sie versuchen, zwei Zeilen mit demselben Primärschlüssel einzufügen. Diese Primärschlüsseleinschränkung löschen, wenn sie nicht existieren sollte. –

Antwort

0

Das Problem, wenn ein Set ist, dass der Inhalt muss eindeutig sein, denn das ist die Definition eines Set ist. Der JPA-Anbieter versucht, dies mit einer Datenbankeinschränkung zu erzwingen. In Ihrem Beispiel fügt es eine Einschränkung in Form einer Primary Key die Offer_id und die Int Amount hinzu, obwohl IMHO es eine Einschränkung für alle Werte von Product Eigenschaft hinzufügen sollte. Der beste Weg, dies zu sehen, ist die SQL-Protokolle zu aktivieren und sehen, was unter der Decke vor sich geht:

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 

Die Art und Weise, dies zu beheben, ist die products Eigenschaft Offer ein List anstelle der Set zu machen:

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