2017-02-28 1 views
0

In meiner Datenbank habe ich eine E-Mail-Kampagne, die 1 zu viele hat, Liste hat viele zu viele Abonnenten.Java Spring Hibernate, Runtime Optional Zuordnungen durchführen?

Das Problem, das ich habe, ist zum Beispiel, wenn ich eine Kampagne ziehe, möchte ich nicht immer alle Abonnenten (könnte eine Menge Abonnenten sein und nur die verschiedenen Kampagnen sehen).

Beim Erstellen von Mapping gibt es eine Möglichkeit, die Mappings optional (zur Laufzeit entscheiden) zu tun? Oder was ist die Lösung für das Problem? Soll ich einfach alles aus der Datenbank holen und den angeforderten Teil ausgeben? Scheint so viel Overhead.

Antwort

1

Ich gehe davon aus, dass Sie einige Zuordnungen haben, die der folgenden ähneln, basierend darauf, wie Sie Ihr Datenmodell beschrieben haben (beachten Sie, dass ich den Abruftyp als Standard von LAZY belasse).

@Entity 
public class Campaign { 
    // ... 
    @OneToMany 
    private List<MailingList> lists; 
} 

@Entity 
public class MailingList { 
    // ... 
    @ManyToMany 
    private List<Subscriber> subscribers; 
} 

@Entity 
public class Subscriber { 
    // ... 
} 

Wenn Sie die Campaign Einheiten und die damit verbundenen MailingList Beziehungen holen möchten, können Sie einfach, dass in HQL/JPQL wie folgt vorgehen:

FROM Campaign c JOIN FETCH c.lists 

Das wird nicht die Teilnehmerliste holen, weil Eine @ManyToMany Assoziation ist standardmäßig faul und wird daher nur dann abgerufen, wenn Sie getSubscribers() aufrufen.

Sie sollten immer favorisieren LAZY holen in Ihren Zuordnungen und geben Sie dann die entsprechenden Join-Abrufe bei Abfragezeit, für die feinste Kontrolle ermöglicht.