Wie Karte eine abstrakte Sammlung mit jpa?
Ich versuche zu arbeiten, wenn es möglich ist, erhalten JPA zu bestehen, eine abstrakte Auflistung mit konkreten Implementierungen.
Soweit mein code sieht wie folgt aus:
@Entity
public class Report extends Model {
@OneToMany(mappedBy = "report",fetch=FetchType.EAGER)
public Set<Item> items;
}
@MappedSuperclass
public abstract class OpsItem extends Model {
@ManyToOne
public RetailOpsBranch report;
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class AItem extends OpsItem {
...
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class BItem extends OpsItem {
...
}
Aber ich halte stolpern auf die mapping-Fehler unten, und ich weiß wirklich nicht, ob dies möglich ist?
JPA error
A JPA error occurred (Unable to build EntityManagerFactory): Use of @OneToMany or
@ManyToMany targeting an unmapped class: models.Report.items[models.OpsItem]
UPDATE
Ich glaube nicht, dass das problem mit der abstrakten Klasse aber die die @MappedSuperClass annotation.
Es sieht aus wie jpa nicht wie auf der Karte die eins-zu-viele-Beziehung mit einer @MappedSuperClass.
Wenn ich die abstrakte Klasse und eine konkrete Klasse, ich habe den gleichen Fehler.
Wenn ich dann auf ändern, um @Entity annotation die zu funktionieren scheinen, mit dem sowohl die abstrakte und konkrete Klasse.
Dies scheint ein bisschen seltsam, auf der Karte eine abstrakte Klasse mit @Entity.
Bin ich ich etwas fehlt?
LÖSUNG
Verwaltet, um es herauszufinden, mit der Hilfe von rhinds.
Zwei Punkte zu beachten:
1) die abstrakte Klasse muss kommentiert werden mit @Entity und Vererbung Strategie der Tabelle pro Klasse für die Unterklassen haben Ihre eigene Tabelle.
2) Identität-Id-Generierung wird nicht in diesem Szenario funktionieren und ich hatte die Verwendung von Tabellen-generation geben.
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class OpsItem extends GenericModel {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
public Long id;
public String branchCode;
@ManyToOne
public Report report;
}
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class AItem extends OpsItem {
...
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist möglich. Sie sollten nur die MappedSuperClass auf der obersten abstrakten Klasse (das isnt gehen, bleiben in sich selbst) und " add Entity annotation über die Umsetzung der Klassen.
Versuchen Sie es zu etwas wie diesem:
In diesem Abschnitt überprüfen der hibernate-Dokumentation für details über deren Nutzung: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e1168
UPDATE
Sorry, völlig übersehen, die Tabelle pro Klasse-bit. Hibernate unterstützt nicht die Abbildung der abstrakten Objekte für Tabelle je Klasse (nur map-Liste, wenn alle Implementierungen sind in einer einzigen SQL-Tabelle und der TABLE_PER_CLASS verwendet die "Tabelle pro konkreter Klasse" - Strategie.
Details der Einschränkungen und die Strategien hier: http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#inheritance-limitations
javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter
Fehler beim speichern eine abstrakte Sammlung.