2017-10-16 11 views
0

Par souci de mon administrateur de base de données, j'ai dû utiliser une stratégie d'héritage jointe, cela serait plus facile d'utiliser Single.Table mais eh, alors disons une entité:Est-il possible de forcer un discriminateur en utilisant la stratégie d'héritage jointe?

@Entity 
    @Inheritance(strategy = InheritanceType.JOINED) 
    public abstract class Post{ 
      @Id 
      @GeneratedValue(strategy = GenerationType.IDENTITY) 
      protected Long id; 
      protected String title; 
      protected String d_type;// I want this to to be the discriminator. 
} 

et l'enfant:

@Entity 
    public abstract class Book{ 
      protected String title; 
} 

l'exemple est simple pour l'amour d'une bonne réponse, mais en réalité, je traite avec 5 « enfants » chacun de ceux-ci ont ses attributs spécifiques et méthodes sauf un appelons le CommonPost qui n'ajoute rien à ce que le parent fournit déjà, c'est pourquoi je veux ajouter un discriminateur avec un type enum comme suit: {xPost, yPost, .., CommonPost}. D'abord est-ce possible ou même pratique? Si non, quelles meilleures options seraient pratiques.

Répondre

0

C'est possible, mais vous pouvez vérifier auprès de votre fournisseur JPA s'il est pris en charge. Je crois que Hibernate soutient cela. Ils l'appellent mixte Stratégie d'héritage:

Voici un exemple:

@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name="POST_TYPE") 
public abstract class Post{ 

Techniquement, il est une stratégie JOINED mais rien ne vous empêche d'ajouter une colonne discriminante (qui est couramment utilisé pour la stratégie monotables).

Aussi une autre suggestion: Si vous dites que l'entité CommonPost n'a pas de propriétés ou de méthodes spécifiques, alors pourquoi ne pas en faire la classe la plus haute dans votre hiérarchie d'héritage? Ensuite, vous pouvez maintenant éliminer la classe abstraite Post.

Voilà comment vous pouvez le faire:

@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name="POST_TYPE") 
@DiscriminatorValue("C") 
public class CommonPost { 
... 
@DiscriminatorValue("X") 
public class XPost extends CommonPost { 
... 
@DiscriminatorValue("Y") 
public class YPost extends CommonPost {