2015-08-10 3 views
2

J'ai une hiérarchie avec trois classes Entity.Comment créer une entité Hibernate par son nom?

classe de base est défini comme suit:

@Entity(name = "User") 
@Table(name = "`users`") 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "`u_role`", discriminatorType = DiscriminatorType.INTEGER) 
@Polymorphism(type = PolymorphismType.EXPLICIT) 
public abstract class User implements Serializable { 

et deux classes enfants:

@Entity(name = "Vendor") 
@Table(name = "`vendors`") 
@DiscriminatorValue("1") 
public class Vendor extends User { 

et

@Entity(name = "Customer") 
@Table(name = "`customers`") 
@DiscriminatorValue("0") 
public class Customer extends User { 

Tout fonctionne très bien. Hibernate enregistre et lit les objets comme prévu. Mais maintenant je veux être capable de créer un objet basé sur son type. Au lieu d'utiliser:

new Vendor() 

Je veux utiliser une méthode de mise en veille prolongée qui me renvoyer une instance en fonction de son type (discriminateur) ou le nom de l'entité (par exemple - « vendeur »). Quelqu'un pourrait-il me dire s'il existe une telle méthode?

+0

Voulez-vous créer des tables distinctes pour le fournisseur et le client? c'est ce que tu veux? –

+0

J'ai des tables séparées pour le vendeur et le client. Comme je l'ai dit, ça fonctionne très bien. Je veux unifier le processus de création d'objet, afin que je puisse créer un nouvel utilisateur par type seulement. –

Répondre

0

vous pouvez implémenter une interface à l'ensemble de cette entité, puis obtenir nouvelle instance de son interface

IEntity iEntity = new Entity(); 
    Class<? extends IEntity> aClass = iEntity.getClass(); 
    IEntity o; 
    try { 
     o = aClass.newInstance(); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 

vous pouvez également utiliser la chaîne comme Class.forName("com.domain.Vendor"); puis utilisez newInstance(), vous pouvez également utiliser Constructor pour être en mesure pour appeler une classe, quelque chose comme ceci

 Class<?> clazz = Class.forName("com.domain.Vendor"); 
     Constructor<?> constructor = aClass.getConstructor(); 
     o = (IEntity) constructor.newInstance();