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

Schreibe einen Kommentar