2016-07-31 10 views
0

Ich habe die Frage über die Verwendung von JPA mit OneToMany Beziehung (bidirektionale) zusammen mit CascadeType.ALL. Basierend auf vlad Post (https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/), in OneToMany Beziehung persistierenden CascadeType.ALL verwenden, sollte auchJPA OneToMany persistent mit CascadeType.ALL nicht persistent Kind

Post post = new Post(); 
post.setName("Hibernate Master Class"); 

Comment comment1 = new Comment(); 
comment1.setReview("Good post!"); 
Comment comment2 = new Comment(); 
comment2.setReview("Nice post!"); 

post.addComment(comment1); 
post.addComment(comment2); 

session.persist(post); 

Aber in meinem Fall bestehen:

//Entity SharedAdvertisementKey 
@ManyToOne 
@JoinColumn(name="SHARED_AD_ID", nullable=false) 
private SharedAdvertisement sharedAdvertisement; 

//Entity SharedAdvertisements 
@OneToMany(mappedBy="sharedAdvertisement", cascade=CascadeType.ALL) 
private List<SharedAdvertisementKey> sharedAdvertisementKey = new ArrayList<>(); 

Es funktioniert nur, wenn ich verbinden beiden Seiten von Entitäten vor dem Eigentümer der Beziehung persistierenden:

sharedAdvertisementKey.setSharedAdvertisement(sharedAdvertisement); 
sharedAdvertisement.addSharedAdvertisementKey(sharedAdvertisementKey); 

So ist die wichtigste Frage: Soll ich von beiden Seiten sorgen immer, auch wenn es ein CascadeType.All auf t er Besitzer der Beziehungsseite?

Antwort

0

Sie mischen zwei sehr unterschiedliche Konzepte.

Ein CascadeType befasst sich mit Aktionen, die auf Beziehungen kaskadieren. Wenn Sie CascadeType.ALL angeben, weisen Sie den Persistenzanbieter an, dass diese Aktionen bei jeder Persistenz, Zusammenführung oder Entfernung dieser Entität in die Relationen repliziert werden sollen.

Damit Kaskadenvorgänge jedoch funktionieren, müssen Sie zunächst sicherstellen, dass die Beziehung ordnungsgemäß verwaltet wird. Wenn Sie sich Vlads Post anschauen, werden Sie zwei sehr wichtige Methoden auf Post bemerken.

public void addDetails(PostDetails details) { 
    this.details = details; 
    details.setPost(this); 
} 

public void removeDetails() { 
    this.details.setPost(null); 
    this.details = null; 
} 

Diese Verfahren stellen sicher, dass die Beziehung zwischen einem PostDetails und einem Post richtig auf Ihren Anforderungen eingehalten wird. So die folgende Abbildung der Annahme:

public class Post { 
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "post", orphanRemoval = true) 
    private PostDetails details; 
} 

Sie könnten die Persistenz Betrieb der beiden von ihnen wie folgt durchführen:

PostDetails details = new PostDetails(); 
details.setUser(currentUser); 
Post post = new Post(); 
post.addDetails(details); 
session.persist(post); 

Sie bemerke ich die addDetails verwendet anstatt der typischen setDetails weil ich sicher machen wollte dass die Beziehung zwischen Post und PostDetails initialisiert wurde.

Hoffe, dass hilft.

+0

Vielen Dank. Das habe ich nicht bemerkt. Ihre Antwort hat mir geholfen, Zweifel an meiner Frage auszuräumen. – allowMeWeb