Comment mapper un abrégé de la collection avec jpa?
Je suis en train de travailler si il est possible d'obtenir JPA pour conserver un abrégé de la collection avec des implémentations concrètes.
Jusqu'à présent, mon code ressemble à ceci:
@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 {
...
}
Mais je ne cesse de trébucher sur l'erreur de cartographie ci-dessous et je ne sais pas vraiment si cela est possible?
JPA error
A JPA error occurred (Unable to build EntityManagerFactory): Use of @OneToMany or
@ManyToMany targeting an unmapped class: models.Report.items[models.OpsItem]
Mise à JOUR
Je ne pense pas que le problème est avec la classe abstraite mais la la @MappedSuperClass annotation.
Il ressemble à jpa n'aime pas la carte de la "un à plusieurs" de la relation avec un @MappedSuperClass.
Si je change la classe abstraite une classe concrète j'ai la même erreur.
Si je puis changer pour @Entity annotation cela semble fonctionner à la fois avec l'abstrait et concret de la classe.
Cela semble un peu étrange pour mapper une classe abstraite avec @Entity.
Je suis-je raté quelque chose?
SOLUTION
Réussi à le comprendre avec l'aide de rhinds.
Deux points à noter:
1) la classe abstraite doit être annotée avec @Entité et de la stratégie de l'héritage de table par classe pour les sous-classes ont leur propre table.
2) l'Identité de génération d'Identifiant ne fonctionne pas dans ce scénario et j'ai dû utiliser de génération de Table de type.
@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 {
...
}
OriginalL'auteur emt14 | 2012-03-26
Vous devez vous connecter pour publier un commentaire.
Yep, c'est possible. Vous ne devriez avoir le MappedSuperClass sur le haut de la classe abstraite (qui isnt va être persistante dans lui-même) et ajouter une Entité d'annotation sur la mise en œuvre des classes.
Essayez de la remplacer par quelque chose comme ceci:
De vérifier la section de la veille prolongée docs pour plus de détails sur son utilisation: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e1168
Mise à JOUR
Désolé, complètement raté la table par classe bits. Hibernate ne prend pas en charge la cartographie de l'abstrait des objets pour la table par classe (uniquement la Liste des cartes si toutes les implémentations sont dans une seule table SQL, et le TABLE_PER_CLASS utilise le "une table par classe concrète" de la stratégie.
Détails de limitations et les stratégies ici: http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#inheritance-limitations
voir ma réponse mis à jour
Humm, donc en gros avoir un "un à plusieurs" de la relation sur une classe abstraite et plusieurs des implémentations concrètes avec leurs propres tableaux, qui n'est pas possible?
Pas tout en utilisant le @MappedSuperclass sur la maison - mère de cette classe ne sont pas conservées de n'importe où dans son propre droit (chaque classe concrète de la table à ses propriétés inclus), donc si Hibernate allait essayer de récupérer une liste<OpItems> il aurait de faire appel à plusieurs sélectionne à travers toute l'individu en béton classes de tables et de les fusionner ensemble pour former une liste ordonnée, de sorte que hibernate juste ne supporte pas.
Si vous avez supprimé l' @MappedSuperclass, vous pourriez avoir une table pour OpItems, avec juste le OpItems propriétés, puis d'une table par classe serait encore travailler sur des implémentations concrètes (des propriétés héritées d'être stockés sur le parent OpItems table) - ce serait le travail, que la mise en veille peut simplement récupérer la liste des<OpItem> à partir de la seule OpItem table. L'inconvénient de ceci est qu'il y aura des performances supplémentaires coût de la récupération et OpItem de la mise en œuvre aurez besoin pour effectuer des jointures supplémentaires pour récupérer l'héritage de données.
OriginalL'auteur rhinds