Wie die Umsetzung polymorphe JPA-entities durch generische Beziehungen
Ich versuche, JPA 2.0 zum erstellen von polymorphen entities durch generische Beziehungen. Sollte es zwei Tabellen, eine Ereignis-Tabelle und eine Benachrichtigung Tisch. Innerhalb dieser Tabelle sind konkrete Entitäten, die miteinander verbunden sind, etwa so:
Event <---------- Notification<X extends Event>
| |
LoginEvent <------ LoginNotification extends Notification<LoginEvent>
Logischerweise sollte dies möglich sein im Ruhezustand, so ist es möglich, in SQL:
+----------+ +----------+
| Event | | Notif |
+----------+ +----------+
| | | Id |
| Id | <- | Evt_id |
| Type | <- | Type |
| ... | | ... |
+----------+ +----------+
Dies ist, was ich habe:
@Entity
@Inheritance
public abstract class Event{
...
}
@Entity
public class LoginEvent extends Event{
...
}
@Entity
@Inheritance
public abstract class Notification<X extends Event>{
@ManyToOne(optional=false, targetEntity=Event.class)
@JoinColumn
private X event;
...
}
@Entity
public class LoginNotification extends Notification<LoginEvent>{
...
}
Mit diesem code, kann ich anhalten und die Holen jedes Ereignis, Benachrichtigung, LoginEvent, oder NotificationEvent, aber es fällt nach unten, wenn ich versuche, die LoginNotification_.event
Beziehung in meinem JPA-2.0-Metamodell Abfragen. Dieses Problem erklärt etwas ähnliches.
public static volatile SingularAttribute<NotificationEntity, EventEntity> event;
Wenn ich versuche, eine Mitmach-Kriterien eine Abfrage, bekomme ich eine Fehlermeldung:
EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<LoginNotification> query = cb.createQuery(LoginNotification.class);
Root<LoginNotification> root = query.from(LoginNotification.class);
// This line complains: Type mismatch: cannot convert from
// Join<LoginNotification,Event> to Join<LoginNotification,LoginEvent>
Join<LoginNotification, LoginEvent> join =
root.join(LoginNotification_.event, JoinType.INNER);
Ich bekommen kann, um diesen Fehler, indem Sie eine neue SingularAttribute
zu den LoginNotification_
Metamodell, aber dies scheitert in der Ausführung:
public abstract class LoginNotification_ extends Notification_ {
//Adding this Removes Type mismatch error, but causes run-time error
public static volatile SingularAttribute<LoginNotification, LoginEvent> event;
...
}
Laut einigen posts, generische Beziehungen nicht funktionieren (Wie behandeln JPA-Annotationen für einen Zeiger auf eine generische Schnittstelle), aber mit einer @ManyToOne(optional=false, targetEntity=Event.class)
Anmerkungen, die wir bekommen können Sie sich zu Verhalten hat. Leider, die Generika scheinen zu brechen, die die JPA criteria query.
Gibt es irgendwelche Vorschläge, wie ich Sie durchführen können diese lookup? Ich kann verwenden LoginNotification.getEvent()
in meinem code, aber ich kann LoginNotification_.event
in meinem JPA-Metamodell-joins. Was ist die alternative zur Verwendung von Generika, um dies zu erreichen?
@Pascal Thivent - Können Sie diese beantworten?
InformationsquelleAutor logan | 2011-01-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Lösung, um dies zu vermeiden, mit den "join" - Funktion und führen Sie eine vollständige cross-join statt:
Ich würde davon ausgehen, dass eine anständige query optimizer sollte kurzen Prozess machen, aber wenn jemand irgendwelche Erkenntnisse über die Effizienz dieses Ansatzes würde ich gerne hören!
InformationsquelleAutor
Ich habe versucht Sie code für eine generische, @logan .
Aber schließlich fand ich der einfachste Weg ist, lassen Sie
T
implementiertSerializable
InformationsquelleAutor