L'utilisation d'hibernate avec les génériques
Je vais avoir du mal à comprendre comment Hibernate traite avec les génériques et je me demandais la meilleure façon d'atteindre mon objectif.
Donné un simple générique de l'entité:
@Entity
public class Box<T>{
private T t;
@Id
private long id;
public void setT(T t) {
this.t = t;
}
public T getT() {
return t;
}
public void setId(long id) {
this.id = id;
}
public long getId() {
return id;
}
}
Lorsque vous allez à travers hibernate initialisation, je suis l'exception: ...has an unbound type and no explicit target entity. Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type
Je suis presque certain c'est parce que je n'ai pas donné hibernate une liste de restrictions de ce <T>
peut effectivement être. Je sais que vous pouvez spécifier des choses comme targetEntity=String.class
ci-dessus t
dans une annotation, mais alors vous perdez la flexibilité d'avoir des médicaments génériques. Puis-je limiter la portée de ce qui est acceptable générique à l'aide d'annotations? Par exemple: Que faire si je veux classes ChildA
, ChildB
, qui hérite d'une classe abstraite Parent
à être permanent. En outre, il devrait également être en mesure d'accepter String
s. Peut Hibernate
faire face à une telle chose?
C'est exactement ce que je demande! 🙂
OriginalL'auteur Ryan | 2011-08-09
Vous devez vous connecter pour publier un commentaire.
Ce que vous cherchez est probablement Hibernate polymorphisme implicite. Il y a aussi un peu connu "toute" relation qui offre une flexibilité totale, mais il a des avantages et des inconvénients. Vous pouvez également utiliser un "tout" dans un plusieurs-à-tout.
Edit: j'ai créé un exécutable exemple sur Github basé autour de votre "Box" de la classe et à l'aide d'un
@Any
de cartographie. Vous pouvez parcourir (ou le La classe de boîte de en particulier) ou de les tester et de les exécuter avecJe devrais avez réalisé vous à la nouveaux 3.6 docs. Ils ont plus de détail. J'ai mis à jour ma réponse avec ce lien et avec un exécutable exemple.
Je vous remercie beaucoup pour passer par ce. Excellente explication et la réponse.
Ryan: Comment ce changement si la Boîte a également besoin d'une Liste de <T>'s comme un objet de T?
Je n'ai jamais eu besoin ou je suis tombé sur la façon de le faire. Je ne suis pas sûr si c'est possible. Il y a un _@Tous et un _@ManyToAny, mais pas d' _@OneToAny. La complexité de cette cartographie pourrait avoir empêché quiconque de ne jamais la mettre en œuvre. Si vous pensez à ce sujet--ignorant le type générique de la contrainte que la mise en veille, le contenu de cette collection pourrait consister en un nombre illimité de types différents, chaque spécifié par un discriminateur qui aurait à vivre quelque part. Il aurait certainement être une relation à l'aide d'une table de jointure, car c'est là que les discriminateurs aurait à vivre.
OriginalL'auteur
Je l'ai déjà fait, mais avec des sous-classes.
Votre classe générique doit être abstraite et sous-classes devez définir le paramètre générique
String
qui n'a rien à faire avec l'arbre d'héritage. Est-ce possible de spécifier en plus?ce que je veux dire, c'est que vous pouvez spécifier générique seulement si la classe qui a définition générique n'est pas enregistré dans la base de données que la mise en veille ne sais pas ce qu'il faut sauver. Vous pouvez utiliser le targetEntity champ pour se spécialiser que
OriginalL'auteur