单向多对一的继承关系 [英] unidirectional many to one relationship with inheritance

查看:156
本文介绍了单向多对一的继承关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在hibernate中映射类ED 类TEL 之间的多对一关系,但是我当我尝试以 Run As ...在eclipse中的服务器上运行时:

 造成者:org.hibernate.MappingException:无法确定类型:
my.package.name.TEL,表:ed,列:
[org.hibernate。 mapping.Column(reference)]

如何解决此错误? ED类仅具有一个TEL属性,但TEL类在许多其他类中用作属性,因此使其成为双向关系是没有意义的。我将永远不需要查找与给定TEL关联的所有ED对象。 大多数TEL实例与ED实例没有关系,但所有ED实例都有一个TEL属性。我是否正确地分类关系?如何修改下面的代码来解决这个错误?请注意,继承是复杂的。



这里是TEL.java:

  @Entity(name =tel)
@Table(name =tel)
public class TEL extends ANY {

私有字符串值;

@Column(name =value)
public String getValue(){return value;}
public void setValue(String val){value = val;}

$ / code>

这里是ED.java:

  @Entity(name =ed)
@Table(name =ed)
public class ED extends ANY {

私人字节[]数据;
private String mediaType;
私有字符串语言;
私人电话参考;

@Column(name =data)
public byte [] getData(){return data;}
public void setData(byte [] d){data = d ;}

@Column(name =mediaType)
public String getMediaType(){return mediaType;}
public void setMediaType(String mt){mediaType = mt;}

@Column(name =language)
public String getLanguage(){return language;}
public void setLanguage(String lng){language = lng;}

@ManyToOne
@JoinColumn(name =hppid)
public TEL getReference(){return reference;}
public void setReference(TEL ref){reference = ref ;}

}

这里是ANY.java:



pre $ @Entity(name =rim_any)
@Table(name =rim_any)
public class ANY extends BaseEntity {

private CS nullFlavor;

public CS getNullFlavor(){return nullFlavor;}
public void setNullFlavor(CS nf){nullFlavor = nf;}

}

这里是BaseEntity.java:

 <$ c 
$ b @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorFormula((CASE WHEN dtype IS NULL NULL'BaseEntity'ELSE dtype END))
@ org.hibernate .annotations.DiscriminatorOptions(force = true)
public abstract class BaseEntity {

@Transient
private String dtype = this.getClass()。getSimpleName();

@Id
@GeneratedValue(
strategy = GenerationType.TABLE,
generator =TBL_GEN)
@TableGenerator(
name = TBL_GEN,
表= GENERATOR_TABLE,
pkColumnName = 的myKey,
而valueColumnName = 喜,
pkColumnValue = hppid,
allocationSize = 20

保护长hppid;

public void setHppid(Long id){this.hppid = id;}
public Long getHppid(){return hppid;}
$ b $ public void setDtype(String dt){dtype = dt;}
public String getDtype(){return dtype;}

public boolean isNew(){return(this.id == null);}

}

下面是我尝试<$ c $时引发的完整堆栈跟踪c> Run As ...在eclipse中的服务器上运行

  ERROR ContextLoader  - 上下文初始化失败
org.springframework.beans.factory.BeanCreationException:在类路径资源[spring / business-config.xml]中定义的名称为'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0'的bean创建时出错:初始化豆失败;嵌套的异常是
org.springframework.beans.factory.BeanCreationException:在类路径资源[spring / business-config.xml]中定义名称为'entityManagerFactory'的Bean时创建错误:调用init方法失败;嵌套异常是javax.persistence.PersistenceException:[PersistenceUnit:myapp]无法在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)〜[spring-beans-3.2]上构建EntityManagerFactory
.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)〜[spring-beans-3.2.5.RELEASE。 jar:3.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:296)〜[spring-beans-3.2.5.RELEASE.jar:3.2。 5.RELEASE]
在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)〜[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)〜[spring-beans-3.2.5.RELEASE。 jar:3.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)〜[spring-beans-3.2.5.RELEASE.jar:3.2.5 .RELEASE]
at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:741)〜[spring-context-3.2.5.RELEASE.jar:3.2.5.RELEASE]
在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)〜[弹簧上下文3.2.5.RELEASE.jar:3.2.5.RELEASE]在org.springframework.web
。 context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)〜[spring-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader .java:294)〜[spring-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)[spring织网,3.2.5.RELE在org.apache上
。 .catalina.core.StandardContext.startInternal(StandardContext.java:5196)[catalina.jar:8.0.15]在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
[卡塔利娜。 jar:8.0.15]
在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1409)[catalina.jar:8.0.15]
at org.apache.catalina .core.ContainerBase $ StartChild.call(ContainerBase.java:1399)[catalina.jar:8.0.15]
。在java.util.concurrent.FutureTask.run(FutureTask.java:262)[NA:1.7。 0_71]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)[na:1.7.0_71]
at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java :615)[na:1.7.0_71]
在java.lang.Thread.run(Thread.java:745)[na:1.7.0_71]
引起:org.springframework.beans.factory .BeanC reationException:创建在类路径资源[spring / business-config.xml]中定义名称为'entityManagerFactory'的Bean时出错:init方法的调用失败;嵌套异常是javax.persistence.PersistenceException:[PersistenceUnit:myapp]无法在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean上创建EntityManagerFactory
(AbstractAutowireCapableBeanFactory.java:1512)〜[spring-beans-3.2 .5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)〜[spring-beans-3.2.5.RELEASE。 jar:3.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)〜[spring-beans-3.2.5.RELEASE.jar:3.2.5 .RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:296)〜[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.jav a:223)〜[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)〜 [spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)〜[spring-beans- 3.2.5.RELEASE.jar:3.2.5.RELEASE]
在org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:438)〜[spring-beans-3.2.5.RELEASE .jar:3.2.5.RELEASE]
在org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:277)〜[spring-beans-3.2.5.RELEASE.jar:3.2.5。
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:139)〜[spring-tx-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.dao.support.Persist enceExceptionTranslationInterceptor。< init>(PersistenceExceptionTranslationInterceptor.java:79)〜[spring-tx-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor。< (PersistenceExceptionTranslationAdvisor.java:71)〜[spring-tx-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory(PersistenceExceptionTranslationPostProcessor.java: 85)〜[spring-tx-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1532)〜[spring -beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1500)〜[spring-beans-3.2。 5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.beans.factory.support.Ab stractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)〜[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
...共有19个框架被省略
由javax引起。 persistence.PersistenceException:[PersistenceUnit:myapp]无法在org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:923)〜[hibernate-entitymanager-4.2.1.Final.jar:4.2]上构建EntityManagerFactory
。 1.Final]在org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:898)
〜[冬眠-的EntityManager-4.2.1.Final.jar:4.2.1.Final]
。在org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:76)〜[hibernate-entitymanager-4.2.1.Final.jar:4.2.1.Final]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean .createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:288)〜[spring-orm-3.2.5.RELEASE.jar:3.2.5.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)〜[spring-orm-3.2.5.RELEASE.jar:3.2.5.RELEASE]
在org.springframework.beans.factory在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory中支持AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1571)〜[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
。 initializeBean(AbstractAutowireCapableBeanFactory.java:1509)〜[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
...省略了34个常用框架
由org.hibernate引起。 MappingException:无法确定类型:my.package.name.TEL,表格:ed,列:[org.hibernate.mapping.Column(引用)]
,位于org.hibernate.mapping.SimpleValue.getType (SimpleValue.java:314)〜[冬眠核-4.2.1.Final.jar:4.2.1.Final]
。在org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:292)〜[ hibernate-core-4.2.1.Final .jar:4.2.1.Final]
在org.hibernate.mapping.Property.isValid(Property.java:239)〜[hibernate-core-4.2.1.Final.jar:4.2.1.Final]
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:469)〜[hibernate-core-4.2.1.Final.jar:4.2.1.Final]
at org.hibernate。映射.UnionSubclass.validate(UnionSubclass.java:61)〜[hibernate-core-4.2.1.Final.jar:4.2.1.Final]
在org.hibernate.cfg.Configuration.validate(Configuration.java :1296)〜[hibernate-core-4.2.1.Final.jar:4.2.1.Final]
在org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1752)〜[hibernate-core- 4.2.1.Final.jar:4.2.1.Final]
at org.hibernate.ejb.EntityManagerFactoryImpl。< init>(EntityManagerFactoryImpl.java:96)〜[hibernate-entitymanager-4.2.1.Final。 jar:4.2.1.final]
在org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:913)〜[hibernate-entitymanager-4.2.1.Final.jar:4.2.1.Final]
... 40个常用框架省略d
2015年4月14日6:12:45 org.apache.catalina.core.StandardContext listenerStart
SEVERE:发送上下文初始化事件给类的监听器实例的异常org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException:在类路径资源[spring / business-config.xml]中定义的名称为'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0'的bean创建时出错:bean初始化失败;嵌套的异常是org.springframework.beans.factory.BeanCreationException:在类路径资源[spring / business-config.xml]中定义的名为'entityManagerFactory'的bean创建时出错:init方法的调用失败;嵌套异常是javax.persistence.PersistenceException:[PersistenceUnit:myapp]无法在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)
构建EntityManagerFactory
。 springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:296)
at org .springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
。在组织.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(Abstrac tApplicationContext.java:741)在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464

在org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)$ b在org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4772)
$ b在org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5196)
。在组织.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1409)
at org.apache .catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1399)$ b $ java.util.concurrent.FutureTask.run(F utureTask.java:262)
在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:615)在java.lang.Thread.run(Thread.java:745)

引起的:org.springframework.beans.factory.BeanCreationException:错误创建名称为豆 '的entityManagerFactory' 在类路径的资源[定义spring / business-config.xml]:调用init方法失败;嵌套异常是javax.persistence.PersistenceException:[PersistenceUnit:myapp]无法在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean上创建EntityManagerFactory
(AbstractAutowireCapableBeanFactory.java:1512)
在org。 springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
。在组织。 springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:296)
在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
。在组织.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
at org.springframework.beans.factory.support.AbstractBeanFacto ry.getBean(AbstractBeanFactory.java:198)
处org.springframework.beans.factory.BeanFactoryUtils org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:438)
。 beansOfTypeIncludingAncestors(BeanFactoryUtils.java:277)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:139)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor。< init> (PersistenceExceptionTranslationInterceptor.java:79)
。在org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor<初始化>(PersistenceExceptionTranslationAdvisor.java:71)
。在org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory( PersistenceExceptionTranslationPostProcessor.java:85)
at org.springframework.beans.factory.support.AbstractAutowi reCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1532)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1500)
位于org.springframework.beans.factory.support。 AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
... 19个
产生的原因:javax.persistence.PersistenceException:[PersistenceUnit:MYAPP]无法在org.hibernate作为构建的EntityManagerFactory
。 $ e $ b $ or $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $'$' java:76)
在org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:2 88)在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)
。在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1571
)中
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1509)
... 34 more
引起:org.hibernate.MappingException:无法确定请键入:my.package.name.TEL,在table:ed,for列:[org.hibernate.mapping.Column(reference)]
在org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:在org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:292 314)

。在org.hibernate.mapping.Property.isValid(Property.java:239)
。在有机.hibernate.mapping.PersistentClass.validate(PersistentClass.java:469)
at org.hibernate.mapping.UnionSubclass.validate(Union Subclass.java:61)
在org.hibernate.cfg.Configuration.validate(Configuration.java:1296)
在org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1752)
at org.hibernate.ejb.EntityManagerFactoryImpl。< init>(EntityManagerFactoryImpl.java:96)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:913)
... 40 more

2015年4月14日6:12:45 org.apache.catalina.core.StandardContext startInternal
SEVERE:Error listenerStart
Apr 14,2015 6:12: 45 PM org.apache.catalina.core.StandardContext startInternal
SEVERE:由于之前的错误导致Context [/ myapp]启动失败
2015年4月14日6:12:45 org.apache.catalina.core .ApplicationContext日志
INFO:关闭Spring根WebApplicationContext
2015年4月14日下午6:12:45 org.apache.coyote.AbstractProtocol start
INFO:Starting ProtocolHandler [http-nio-8080 ]
2015年4月14日6:12:45 org.apache.coyote.AbstractProtoc ol start
INFO:Starting ProtocolHandler [ajp-nio-8009]
2015年4月14日6:12:45 org.apache.catalina.startup.Catalina start
INFO:Server在12061年启动ms






编辑:






我试过@ VladMihalCea的建议:

 @ManyToOne 
@MapsId(hppid)
public TEL getReference(){return reference;}


,但得到了同样的错误。然后我尝试了他的另一个建议:

$ $ p $ $ $ $ $ $
@JoinColumn(name =ref_hppid)$ b $在ED.Java中公开TEL getReference(){返回引用;}

,但没有做任何更改到TEL.java,或任何其他文件。这也给出了相同的堆栈跟踪。

我需要对TEL.java进行其他更改吗? Ed

BaseEntity 继承 hppid 列,然后使用多对一关联复制它:

  @ManyToOne 
@JoinColumn(name =hppid)
public TEL getReference(){return reference;}
public void setReference(TEL ref){reference = ref;}




    如果FK是PK的补充,您可以将它重命名为 ref_hppid

     @JoinColumn(name =ref_hppid)


  1. 如果你想让PK和FK共享同一列,你需要使用 @MapsId

    <$ p $ @ManyToOne
    @MapsId(hppid)
    public TEL getReference(){return reference;}



I am trying to map a many to one relationship between class ED and class TEL in hibernate, but I am getting the following error when I try to Run As.. Run on server in eclipse:

Caused by: org.hibernate.MappingException: Could not determine type for:   
my.package.name.TEL, at table: ed, for columns: 
[org.hibernate.mapping.Column(reference)]

How can I resolve this error? The ED class only has one TEL property, but the TEL class is used as properties in so many other classes that it does not make sense to make this a bi-directional relationship. I will never need to look up all the ED objects associated with a given TEL. Most TEL instances will not have relationships with ED instances, but all ED instances will have one TEL property. Am I correctly classifying the relationship? And how to I change the code below to resolve this error? Note that inheritance is complicating things.

Here is TEL.java:

@Entity(name = "tel")
@Table(name = "tel")
public class TEL extends ANY {

    private String value;

    @Column(name = "value")
    public String getValue(){return value;}
    public void setValue(String val){value = val;}
}

Here is ED.java:

@Entity(name = "ed")
@Table(name = "ed")
public class ED extends ANY{

    private byte[] data;
    private String mediaType;
    private String language;
    private TEL reference;

    @Column(name = "data")
    public byte[] getData(){return data;}
    public void setData(byte[] d){data = d;}

    @Column(name = "mediaType")
    public String getMediaType(){return mediaType;}
    public void setMediaType(String mt){mediaType = mt;}

    @Column(name = "language")
    public String getLanguage(){return language;}
    public void setLanguage(String lng){language = lng;}

    @ManyToOne
    @JoinColumn(name = "hppid")
    public TEL getReference(){return reference;}
    public void setReference(TEL ref){reference = ref;}

}

Here is ANY.java:

@Entity(name = "rim_any")
@Table(name = "rim_any")
public class ANY extends BaseEntity{

    private CS nullFlavor;

    public CS getNullFlavor(){return nullFlavor;}
    public void setNullFlavor(CS nf){nullFlavor = nf;}

}

Here is BaseEntity.java:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorFormula("(CASE WHEN dtype IS NULL THEN 'BaseEntity' ELSE dtype END)")
@org.hibernate.annotations.DiscriminatorOptions(force=true)
public abstract class BaseEntity {

    @Transient
    private String dtype = this.getClass().getSimpleName();

    @Id 
    @GeneratedValue(
        strategy=GenerationType.TABLE, 
        generator="TBL_GEN")
    @TableGenerator(
        name="TBL_GEN",
        table="GENERATOR_TABLE",
        pkColumnName = "mykey",
        valueColumnName = "hi",
        pkColumnValue="hppid",
        allocationSize=20
    )
    protected Long hppid;

public void setHppid(Long id) {this.hppid = id;}
public Long getHppid() {return hppid;}

public void setDtype(String dt){dtype=dt;}
public String getDtype(){return dtype;}

public boolean isNew() {return (this.id == null);}

}

Here is the complete stack trace thrown when I try to Run As...Run on server from within eclipse:

ERROR ContextLoader - Context initialization failed  
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' defined in class path resource [spring/business-config.xml]: Initialization of bean failed; nested exception is  
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring/business-config.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: myapp] Unable to build EntityManagerFactory
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:741) ~[spring-context-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) ~[spring-context-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389) ~[spring-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294) ~[spring-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) [spring-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4772) [catalina.jar:8.0.15]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5196) [catalina.jar:8.0.15]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:8.0.15]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409) [catalina.jar:8.0.15]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399) [catalina.jar:8.0.15]
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_71]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_71]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_71]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_71]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring/business-config.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: myapp] Unable to build EntityManagerFactory
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1512) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:438) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:277) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:139) ~[spring-tx-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.<init>(PersistenceExceptionTranslationInterceptor.java:79) ~[spring-tx-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor.<init>(PersistenceExceptionTranslationAdvisor.java:71) ~[spring-tx-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory(PersistenceExceptionTranslationPostProcessor.java:85) ~[spring-tx-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1532) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1500) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    ... 19 common frames omitted
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: myapp] Unable to build EntityManagerFactory
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:923) ~[hibernate-entitymanager-4.2.1.Final.jar:4.2.1.Final]
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:898) ~[hibernate-entitymanager-4.2.1.Final.jar:4.2.1.Final]
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:76) ~[hibernate-entitymanager-4.2.1.Final.jar:4.2.1.Final]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:288) ~[spring-orm-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310) ~[spring-orm-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1571) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1509) ~[spring-beans-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    ... 34 common frames omitted
Caused by: org.hibernate.MappingException: Could not determine type for: my.package.name.TEL, at table: ed, for columns: [org.hibernate.mapping.Column(reference)]
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:314) ~[hibernate-core-4.2.1.Final.jar:4.2.1.Final]
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:292) ~[hibernate-core-4.2.1.Final.jar:4.2.1.Final]
    at org.hibernate.mapping.Property.isValid(Property.java:239) ~[hibernate-core-4.2.1.Final.jar:4.2.1.Final]
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:469) ~[hibernate-core-4.2.1.Final.jar:4.2.1.Final]
    at org.hibernate.mapping.UnionSubclass.validate(UnionSubclass.java:61) ~[hibernate-core-4.2.1.Final.jar:4.2.1.Final]
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1296) ~[hibernate-core-4.2.1.Final.jar:4.2.1.Final]
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1752) ~[hibernate-core-4.2.1.Final.jar:4.2.1.Final]
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:96) ~[hibernate-entitymanager-4.2.1.Final.jar:4.2.1.Final]
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:913) ~[hibernate-entitymanager-4.2.1.Final.jar:4.2.1.Final]
    ... 40 common frames omitted
Apr 14, 2015 6:12:45 PM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener  
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' defined in class path resource [spring/business-config.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring/business-config.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: myapp] Unable to build EntityManagerFactory
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:741)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4772)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5196)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring/business-config.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: myapp] Unable to build EntityManagerFactory
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1512)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:438)
    at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:277)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:139)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.<init>(PersistenceExceptionTranslationInterceptor.java:79)
    at org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor.<init>(PersistenceExceptionTranslationAdvisor.java:71)
    at org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory(PersistenceExceptionTranslationPostProcessor.java:85)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1532)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1500)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
    ... 19 more
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: myapp] Unable to build EntityManagerFactory
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:923)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:898)
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:76)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:288)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1571)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1509)
    ... 34 more
Caused by: org.hibernate.MappingException: Could not determine type for: my.package.name.TEL, at table: ed, for columns: [org.hibernate.mapping.Column(reference)]
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:314)
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:292)
    at org.hibernate.mapping.Property.isValid(Property.java:239)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:469)
    at org.hibernate.mapping.UnionSubclass.validate(UnionSubclass.java:61)
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1296)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1752)
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:96)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:913)
    ... 40 more

Apr 14, 2015 6:12:45 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Error listenerStart
Apr 14, 2015 6:12:45 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/myapp] startup failed due to previous errors
Apr 14, 2015 6:12:45 PM org.apache.catalina.core.ApplicationContext log
INFO: Closing Spring root WebApplicationContext
Apr 14, 2015 6:12:45 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
Apr 14, 2015 6:12:45 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-nio-8009"]
Apr 14, 2015 6:12:45 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 12061 ms


EDIT:


I tried @VladMihalCea's suggestion of:

@ManyToOne
@MapsId("hppid")
public TEL getReference(){return reference;}

in ED.java, but got the same error. I then tried his other suggestion of:

@ManyToOne
@JoinColumn(name = "ref_hppid")
public TEL getReference(){return reference;}

in ED.Java but did not make any changes to TEL.java, or to any other file. This also gives the same stack trace.

Do I need to make other changes to TEL.java? What else can I try?

解决方案

The Ed class inherits the hppid column from BaseEntity and then you duplicate it with the many-to-one association:

@ManyToOne
@JoinColumn(name = "hppid")
public TEL getReference(){return reference;}
public void setReference(TEL ref){reference = ref;}

  1. If the FK is complementary to the PK, you can simply rename it to ref_hppid

    @JoinColumn(name = "ref_hppid")
    

  2. If you want the PK and the FK to share the same column, you need to use @MapsId:

    @ManyToOne
    @MapsId("hppid")
    public TEL getReference(){return reference;}
    

这篇关于单向多对一的继承关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆