2014-07-16 7 views
0

je une classe abstraite pour mes clients:Hibernate mapping de la collection polymorphes avec annotations

@Entity 
public class AbstractClientEntity extends AbstractPersonneEntity implements Demarchable { 

@Column(name="ID_REFERENT") 
private AbstractEmployeEntity referent; 
... 

La classe concrète ressemble à ceci:

@Entity 
@DiscriminatorValue(TypePersonne.Values.INVITE) 
public class InviteEntity extends AbstractClientEntity implements Invitable { 
... 

et

@Entity 
@DiscriminatorValue(TypePersonne.Values.AUTRE) 
public class AutreClientEntity extends AbstractClientEntity { 

et je une autre classe abstraite pour mon employé qui possède un Set of AbstractClientEntity:

@Entity 
public class AbstractEmployeEntity extends AbstractPersonneEntity { 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "ID_REFERENT", nullable = false) 
private MonitriceEntity monitrice = new MonitriceEntity(); 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "referent") 
private Set<AbstractClientEntity> listeClients = new HashSet<AbstractClientEntity>(); 
... 

Le problème est quand je TRIE pour exécuter mon web-app, cette exception est levée:

org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory ch.tupperware.tuppergestion.dao.AbstractDao.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/config/tupper-servlet.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: ch.tupperware.tuppergestion.entity.AbstractEmployeEntity, at table: PERSONNE, for columns: [org.hibernate.mapping.Column(ID_REFERENT)] 
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:507) 
    org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) 
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:283) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1055) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290) 
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287) 
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:825) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:767) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:685) 

Je ne sais pas comment je peux résoudre ce problème ...

Merci pour l'aide

Répondre

0

Enfin, je vais répondre à ma propre question et nous espérons qu'il aidera quelqu'un ...

Après plusieurs essais, j'adopte la solution pour avoir une liste pour chaque classe concrète, je dois gérer mon AbstractEmployeEntity:

@Entity 
public class AbstractEmployeEntity extends AbstractPersonneEntity { 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "referent") 
private Set<HotesseEntity> listeHotesse = new HashSet<HotesseEntity>(); 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "referent") 
private Set<InviteEntity> listeInvites = new HashSet<InviteEntity>(); 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "referent") 
private Set<AutreClientEntity> listeAutreClients = new HashSet<AutreClientEntity>(); 

Espérons que cela aidera quelqu'un ...

0

la cause est claire:

Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: ch.tupperware.tuppergestion.entity.AbstractEmployeEntity, at table: PERSONNE, for columns: [org.hibernate.mapping.Column(ID_REFERENT)] 

Votre classe ch.tupperware.tuppergestion.entity.AbstractEmployeEntity ne trouve pas la colonne ID_REFERENT dans votre tableau PERSONNE.

Comment avez-vous mappé votre classe AbstractEmployeEntity. Si c'est une classe abstraite, pourquoi ne pas la mettre en correspondance avec @MappedSuperclass?

+0

Merci pour la réponse rapide. Je jure que le champ ID_REFERENT est dans ma table PERSONNE. J'ai mappé ma classe abstraite avec @MappedSuperclass parce que je veux être en mesure d'avoir une collection de AbstractClientEntity dans mon AbstractEmployeEntity. Quand je TRIE avec l'annotation @ de MappedSuperclass, l'exception org.hibernate.AnnotationException: Utilisation de @ OneToMany ou @ ManyToMany ciblant une classe unmapped: ch.tupperware.tuppergestion.entity.AbstractEmployeEntity.listeClients [ch.tupperware.tuppergestion. entity.AbstractClientEntity] Est lancé ... – bryce

+0

Je suggère que vous annotez seulement '@ MappedSuperclass' ** seulement ** aux classes abstraites et aux classes non concrètes. –

+0

J'ai essayé d'annoter toutes mes classes abstraites avec '@ MappedSuperClass' mais maintenant j'ai la même exception que ci-dessus mais sur une classe concrète: l'exception imbriquée est org.hibernate.AnnotationException: Utilisation de @OneToMany ou @ManyToMany ciblant une classe non mappée : ch.tupperware.tuppergestion.entity.AmbassadriceEntity.listeClients [ch.tupperware.tuppergestion.entity.AbstractClientEntity] – bryce