こんにちは、Hibernate4とmavenでSpringを使い始めたばかりです。基本的に、私のクラス階層はHUmanMicroTaskがMicroTaskから拡張したものです。将来的には、MicroTaskから拡張される他のいくつかのクラスがあるかもしれません。具体的なクラスごとに1つのテーブルを作成しようとしていました。これは、spring3およびhibernate 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
私はかなりの数のフォーラムを見てきましたが、どこで間違いを犯しているのかを決めるつもりはありません。私の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>
My Mavenの構成
<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>
親切に私を助けてください。どこで間違いを犯したかわかりません。
これは、両方のクラスのId列によるものです。 HumanMicroTaskからIDを削除します。
これを修正するには@Idをサブクラスから削除します
microTaskで
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "MICROTASKID")
private String microTaskId;
サブクラスHumanMicroTaskでremove
@Id
@Column(name = "HMTID")
private String humanMicroTaskid;
親クラスには主キー「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(主キー)
name:Varchar
子クラスはこれにマッピングされます:
テーブル「concrete_person」
職業:Varchar
idPerson:int(自動生成、親テーブルとこのテーブルのプライマリクラスへの外部キー)
//仮定
Mysqlデータベース。
JPA 2 Hibernate実装。
NetBeans 7x Ide