2010-07-17 9 views
2

héritage dynamiquehéritage dynamique - Java

J'ai une situation où je veux une classe (qui est une entité JPA) pour être en mesure d'étendre soit de classe A ou B dynamiquement. Ma pensée était d'utiliser des génériques, mais il semble que les génériques ne supportent pas cela. Par exemple:


@Entity 
public abstract class Resource() { 
... 
} 

@Entity 
public abstract class Snapshot() { 
... 
} 

public abstract class CommonRS<R extends Resource, S extends Snapshot> { 
/* This is the class that I want to dynamically assign Inheritance to. */ 
... 
} 

@Entity 
public class FeedResource extends CommonRS<Resource> { 
... 
} 

@Entity 
public class FeedSnapshot extends CommonRS<Snapshot> { 
... 
} 

La raison pour laquelle je veux faire est que FeedResource doit hériter de ressources et FeedSnapshot doit hériter de Snapshot parce que les deux classes utilisent l'APP stratégie de jointure InheritanceType.JOINED et sont conservés à des tables différentes, mais ils ont tous deux partager des attributs communs et je voudrais qu'ils puissent hériter ces attributs communs.

Je comprends que je peux je peux utiliser @Embeddable sur CommonRS et l'intégrer dans FeedResource et FeedSnapshot.

Étant donné que Java ne prend pas en charge l'héritage multiple, je ne vois pas d'autre moyen de le faire que d'utiliser Embeddable.

Merci d'avance.

Répondre

2

Voici comment vous le faites

@MappedSuperClass 
public abstract class Base() { 
... 
// put your common attributes here 
} 

@Entity 
public abstract class Resource() extends Base{ 
... 
} 

@Entity 
public abstract class Snapshot() extends Base { 
... 
} 

public abstract class CommonRS<R extends Base> { 
... 
} 

@Entity 
public class FeedResource extends CommonRS<Resource> { 
... 
} 

@Entity 
public class FeedSnapshot extends CommonRS<Snapshot> { 
... 
} 

MISE À JOUR

Une autre solution peut être mettre en œuvre même interface (si l'héritage commun ne peut pas être atteint). Dans ce cas, l'annotation @MappedSuperClass doit être utilisée sur les classes de base réelles.

@Entity 
public abstract class Resource() extends BaseIntf { 
... 
} 

@Entity 
public abstract class Snapshot() extends BaseIntf { 
... 
} 

public abstract class CommonRS<R extends BaseIntf> { 
... 
} 

@Entity 
public class FeedResource extends CommonRS<Resource> { 
... 
} 

@Entity 
public class FeedSnapshot extends CommonRS<Snapshot> { 
... 
} 
+0

Merci. Une chose que j'ai oublié de mentionner dans mon exemple ci-dessus est que Resource et Snapshot ne peuvent pas étendre "Base" car il y a beaucoup de "Bases" qu'ils peuvent devoir étendre. C'est pourquoi j'espérais que CommonRS étende dynamiquement la "Base" dont j'avais besoin. J'arrive à la conclusion que la seule façon de le faire est d'utiliser Embeddable. – DKD

+0

Essayez d'implémenter la même interface au lieu d'étendre la classe de base. Devrait fonctionner de la même manière –

+0

Voir la réponse mise à jour –