[SPRING] Spring 3.1 상속을위한 Hibernate 4 예외 [org.hibernate.mapping.RootClass에 캐스트 할 수 없음]
SPRINGSpring 3.1 상속을위한 Hibernate 4 예외 [org.hibernate.mapping.RootClass에 캐스트 할 수 없음]
안녕하세요, 저는 Hibernate4와 maven을 사용하여 Spring을 사용하기 시작했습니다. 기본적으로 클래스 계층은 HUmanMicroTask가 MicroTask에서 확장됩니다. 앞으로는 MicroTask에서 확장되는 몇 가지 다른 클래스가있을 수 있습니다. 나는 스프링 3과 최대 절전 모드 4를 실행하고 실행하는 가장 간단한 방법 인 구체적인 클래스 당 하나의 테이블을 갖기 위해 노력하고있었습니다. 그러나 코드를 실행할 때. 다음과 같은 예외가 계속 발생합니다.
13:11:52,260 ERROR TestContextManager:324 - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@6ef137d] to prepare test instance [HumanMicroTaskBaseHibernateTest@52c05d3b]
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:290)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [database-config.xml]: Invocation of init method failed; nested exception is java.lang.ClassCastException: org.hibernate.mapping.UnionSubclass cannot be cast to org.hibernate.mapping.RootClass
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:103)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228)
at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148)
... 24 more
Caused by: java.lang.ClassCastException: org.hibernate.mapping.UnionSubclass cannot be cast to org.hibernate.mapping.RootClass
at org.hibernate.cfg.annotations.PropertyBinder.bind(PropertyBinder.java:212)
at org.hibernate.cfg.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:203)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2013)
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:768)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:687)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3431)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3385)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1337)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1727)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1778)
at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:184)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:314)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
... 38 more
꽤 많은 포럼을 보았지만 실수를 저지르는 위치를 결정할 수 없습니다. My MicroTask 클래스는 다음과 같습니다.
@Entity
@Table(name = "MICROTASK")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class MicroTask {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "MICROTASKID")
private String microTaskId;
@Column(name = "CREATIONDATE")
private Date creationDate;
@Column(name = "DESCRIPTION")
private String description;
public Date getCreationDate() {
return creationDate;
}
//More Getters and setters
내 HumanMicroTask 클래스는 다음과 같습니다.
@Entity
@Table(name = "HUMANMICROTASK")
@AttributeOverrides({
@AttributeOverride(name="microTaskId", column=@Column(name="MICROTASKID")),
@AttributeOverride(name="creationDate", column=@Column(name="CREATIONDATE")),
@AttributeOverride(name="description", column=@Column(name="DESCRIPTION"))
})
public class HumanMicroTask extends MicroTask {
@Column(name = "TITLE")
private String title;
@Column(name = "CHANNEL")
private String channel;
@Id
@Column(name = "HMTID")
private String humanMicroTaskid;
public String getId() {
return humanMicroTaskid;
}
//More Getters and setters
그리고 내 config.xml은 다음과 같습니다 :
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
">
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass">
<value>${jdbc.driver.className}</value>
</property>
<property name="jdbcUrl">
<value>${jdbc.url}</value>
</property>
<property name="user">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="packagesToScan" value="com.hp.hpl.crowdcloud" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${jdbc.hibernate.dialect}</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
<!-- uncomment this for first time run -->
<prop key="hibernate.hbm2ddl.auto">create</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<tx:annotation-driven />
</beans>
내 메이븐 설정
<maven.test.failure.ignore>true</maven.test.failure.ignore>
<org.springframework.version>3.1.0.RELEASE</org.springframework.version>
<hibernate.version>4.1.1.Final</hibernate.version>
<sl4j.version>1.5.6</sl4j.version>
친절하게 도와주세요. 나는 실수를 어디에서할지 확신하지 못한다.
해결법
-
==============================
1.두 클래스의 Id 열 때문입니다. HumanMicroTask에서 ID를 제거하십시오.
두 클래스의 Id 열 때문입니다. HumanMicroTask에서 ID를 제거하십시오.
-
==============================
2.이 문제를 해결하기 위해 하위 클래스에서 @Id 제거
이 문제를 해결하기 위해 하위 클래스에서 @Id 제거
MicroTask 유지
@Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "uuid") @Column(name = "MICROTASKID") private String microTaskId;
하위 클래스 HumanMicroTask에서 제거
@Id @Column(name = "HMTID") private String humanMicroTaskid;
-
==============================
3.나는 당신의 부모 클래스가 프라이 머리 키를 가지고 있기 때문에 같은 문제가 생겼다 : 'Id', 서브 클래스가 생성 될 때 그들은 부모의 프라이 머리 키의 정확한 이름으로 외래 키를 자동으로 생성한다.
나는 당신의 부모 클래스가 프라이 머리 키를 가지고 있기 때문에 같은 문제가 생겼다 : 'Id', 서브 클래스가 생성 될 때 그들은 부모의 프라이 머리 키의 정확한 이름으로 외래 키를 자동으로 생성한다.
예 : (의사 코드)
학급
@Entity @Inheritance(strategy = InheritanceType.JOINED) @Table(name = "abstract_person", catalog = "catalog", schema = "") class AbstractPerson{ //Primary Key @Id @Column(name = "idPerson") int idPerson; @Basic @Column(name = "name") String name; //corresponding getters and setters }
아동 학급 :
@Entity @Table(name = "concrete_person", catalog = "catalog", schema = "") class ConcretePerson extends AbstractPerson{ //No id or primary key is defined here @Basic @Column(name="profession") String profession; }
상위 클래스가이 클래스에 매핑됩니다.
표 "abstract_person" id : Int (기본 키) 이름 : Varchar
하위 클래스는 다음과 같이 매핑됩니다.
표 "concrete_person" 직업 : Varchar idPerson : int (자동 생성, 외부 키 - 부모 테이블 및 기본 키 이 테이블의 클래스)
// 가정 MySQL 데이터베이스; Jpa 2 Hibernate Implementation; NetBeans 7x Ide
from https://stackoverflow.com/questions/12087011/spring-3-1-hibernate-4-exception-for-inheritance-cannot-be-cast-to-org-hibernat by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @Value 스프링 주석을 사용하여지도를 삽입하는 방법은 무엇입니까? (0) | 2018.12.15 |
---|---|
[SPRING] 일치하는 와일드 카드는 엄격하지만 'tx : annotation-driven'요소에 대한 선언을 찾을 수 없습니다. (0) | 2018.12.15 |
[SPRING] JPA / JTA / @ Transactional Spring 주석 (0) | 2018.12.15 |
[SPRING] Hibernate 질의 결과를 커스텀 클래스에 매핑? (0) | 2018.12.15 |
[SPRING] WebServiceTemplate을 사용하여 SOAP 요청을 보내는 방법은 무엇입니까? (0) | 2018.12.15 |