2013-10-17 20 views
7

ich zwei JPA-Entitäten wie dieses:JPA Kaskade Persistenz mit Entität ElementCollection Schlüssel

@Entity 
class Foo { 
    @Id 
    private long id; 
    // ... 
} 

@Entity 
class Bar { 
    @ElementCollection(targetClass = String.class, fetch = FetchType.LAZY) 
    @MapKeyJoinColumn(name = "foo_id", referencedColumnName = "id") 
    @MapKeyClass(Foo.class) 
    @Column(name = "content") 
    @CollectionTable(name = "bar_foo_content", 
        joinColumns = @JoinColumn(name = "bar_id", referencedColumnName = "id")) 
    @ManyToMany(cascade = CascadeType.ALL) 
    private Map<Foo, String> fooContent = Maps.newHashMap(); 
    // ... 
} 

Wie Sie sehen können, das fooContent Feld bildet eine many-to-many-Beziehung zwischen Bar und Foo, so dachte ich, es wäre angebracht, @ManyToMany zu verwenden, um für das Feld Kaskadierung anzugeben. Wenn jedoch ein Bar mit ein paar Foo → String Werte in der Karte zu bestehen versucht, erhalte ich die folgende Ausnahme:

javax.persistence.RollbackException: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: <<instance of Foo>> 

Offensichtlich hat Eclipse nicht die Ausdauer meiner Foo Instanzen kaskadieren. Wie sollte ich fooContent annotieren, um kaskadierte Persistenzen zu erhalten?

+0

Wie sieht dein 'Foo' aus? Die Ausnahme sieht aus wie ein Problem zwischen 'Foo' und einer anderen Entität. – Uooo

+0

@Uooo der Fehler passiert immer noch mit dem genauen Code oben (d. H. Keine Felder mehr in Foo) – dflemstr

+0

Ich habe das gleiche Problem. Haben Sie schon eine Lösung gefunden? – drame

Antwort

2

Sie benötigen keine @ManyToMany Annotation hier. Operationen auf ElementCollection s sind immer kaskadiert.

+0

Die Ausnahme wird auch ohne '@ ManyToMany' ausgelöst – dflemstr

4

Es ist ein Fehler, sowohl @ElementCollection als auch @ManyToMany gleichzeitig anzugeben. Die zwei Anmerkungen bezeichnen unterschiedliche Konzepte von OR, die eine Größer-als-Eins-Kardinalitätsbeziehung abbilden.

ElementCollection ist eine strenge Aggregation oder Zusammensetzung Beziehung, wobei die Elemente in der Sammlung von ihren Eltern-Objekt streng Gesellschaft sind, und eine Wechselwirkung mit den Elementen, wie das Abfragen usw. aufweisen, über die übergeordneten erfolgen. Die Vielfalt der Eltern gegenüber den Elementen in der Sammlung ist immer eins zu viele. Die Elementinstanzen können zu einem bestimmten Zeitpunkt nur mit einem Elternteil verknüpft sein.

ManyToMany repräsentiert eine Beziehung zwischen mehr oder weniger unabhängigen Entitäten, die einzeln und unabhängig von der Instanz abgefragt und manipuliert werden können, die die mit @ManyToMany gekennzeichnete Eigenschaft deklariert. ManyToMany Beziehungen implizieren, dass die verwandten Instanzen mit einer beliebigen Anzahl anderer Instanzen durch andere deklarierte Beziehungen verknüpft sein können.

Ich würde erwarten, dass jede standardkonforme JPA-Implementierung entweder einen Fehler zeigt oder ein "undefiniertes" Verhalten für eine Eigenschaft aufweist, die wie folgt kommentiert ist.

Verwandte Themen