JPA注释-将继承层次结构映射到一个表

时间:2019-07-31 14:41:28

标签: java jpa inheritance

我尝试将继承层次结构映射到一个表。 我有以下实体:

客户实体

该实体应该是反映数据库中物理表的实体。

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name= "CU_CUSTOMER_TYPE", discriminatorType =     DiscriminatorType.STRING)
@Table(name = "CUSTOMER")
public abstract class Customer {

    @Id
    @Column(name = "CU_ID")
    Long id;

    @Column(name = "CU_CUSTOMER_KEY")
    Long customerKey;

    @Column(name = "CU_LASTNAME")
    String lastname;

    @Column(name = "CU_FIRSTNAME")
    String firstname;

    // Getters, setters, etc...
}

打印机实体

此实体是Customer的子类,由CU_COSTOMER_TYPE =“ 1”区分。

@Entity
@DiscriminatorValue("1")
public class Printer extends Customer {

}

发布者实体

此实体是Customer的另一个子类,由CU_COSTOMER_TYPE =“ 2”区分。

@Entity
@DiscriminatorValue("2")
public class Publisher extends Customer {

}

报纸

此实体通过OneToOne关系链接到打印机和发布者。

@Entity
@Table(name = "NEWSPAPER")
public class Newspaper {

    @Id
    @Column(name = "NP_NUMBER")
    Long number;

    @Column(name = "NP_TITLE", length = 40)
    String title;

    @OneToOne
    @JoinColumn(name = "NP_PRINTER_CUSTOMER_KEY", referencedColumnName = "CU_CUSTOMER_KEY")
    Printer printer;

    @OneToOne
    @JoinColumn(name = "NP_PUBLISHER_CUSTOMER_KEY", referencedColumnName = "CU_CUSTOMER_KEY")
    Publisher publisher;

    // Getters, setters, etc...

}

在应用程序启动时,出现此错误:

  

Newspaper.printer的referencedColumnNames(CU_CUSTOMER_KEY)引用打印机未映射到单个属性

这是相关的堆栈跟踪:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [ch/post/it/vevol/zebis/domain/config/PersistenceConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: referencedColumnNames(CU_CUSTOMER_KEY) of ch.post.it.vevol.zebis.domain.model.Newspaper.printer referencing ch.post.it.vevol.zebis.domain.model.Printer not mapped to a single property
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1630)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1080)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:857)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
[...]
Caused by: org.hibernate.AnnotationException: referencedColumnNames(CU_CUSTOMER_KEY) of ch.post.it.vevol.zebis.domain.model.Newspaper.printer referencing ch.post.it.vevol.zebis.domain.model.Printer not mapped to a single property
at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:320)
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:100)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1786)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1730)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1617)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:360)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:384)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:371)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:336)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1688)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1626)
... 59 more

我的代码有什么问题? 一张桌子的策略实施得好吗?

感谢您的帮助;)

0 个答案:

没有答案
相关问题