簡體   English   中英

帶有注釋的Hibernate多態集合映射

[英]Hibernate polymorphic collection mapping with annotation

我為客戶提供了一個Abstract類:

@Entity
public class AbstractClientEntity extends AbstractPersonneEntity implements Demarchable {

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

具體的類如下所示:

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

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

我為員工提供了另一個抽象類,該類具有一組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>();
...

問題是當我嘗試運行我的Web應用程序時,拋出此異常:

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)

我不知道該如何解決這個問題...

謝謝您的幫助

原因很明確:

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)]

您的類ch.tupperware.tuppergestion.entity.AbstractEmployeEntity在表PERSONNE找不到列ID_REFERENT

您是如何映射AbstractEmployeEntity類的。 如果它是抽象類,為什么不使用@MappedSuperclass映射它呢?

最后,我將回答我自己的問題,並希望它將對某人有所幫助。

經過多次嘗試,我采用了該解決方案來為我必須在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>();

希望這會幫助某人...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM