2016-10-07 16 views
0

テーブルを結合しようとしている小さな割り当てです。私はMySQLの& Javaでいくつかの経験を持っていますが、Spring、Hibernate & HSQLには新しいです。私が働いてきたテーブルを結合する@OneToMany/@ManyToOne

は、私がすでに作成されますが、何のプロイムず、フレームワークがない巨大な変更が、イム問題はもうどこにあるかわからない...だけでなく私に新しいです...

前に合流しますいくつかのテーブルを結合してクラスを関連付けることができましたが、すべての顧客レコードに従業員IDへの外部キーが必要です。私はいくつかの異なる設定を試みたが、役に立たなかった。ここで私は今どこにいるのだろうか?次のエラーが供給

イム:

java.lang.IllegalStateException: Failed to load ApplicationContext 

at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:94) 
at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:72) 
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) 
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) 
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:212) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:200) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:259) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:261) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:219) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in nl.mad.w2l2.ApplicationConfig: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:125) 
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60) 
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:109) 
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:261) 
at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:68) 
at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:86) 
... 29 more 

Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1239) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.access$600(EntityManagerFactoryBuilderImpl.java:120) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:855) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845) 
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844) 
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152) 
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343) 
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) 
... 44 more 

Caused by: org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: nl.mad.w2l2.model.Employee.bsn 
at org.hibernate.cfg.annotations.CollectionBinder.getCollectionBinder(CollectionBinder.java:330) 
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1922) 
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:963) 
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:796) 
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3845) 
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3799) 
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1412) 
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852) 
... 52 more 

最後のエラーは、私はイムが参加すると何か間違ったことと信じています。私は検索して検索したり、チュートリアルや2を試しましたが、私は何かを見落としていると思います...私は問題をピンポイントするためにコードの大部分を書き直して削除しましたが、 !noobish間違いや見落とし、事前にとても残念&感謝:)

抽象Userクラス:

@Entity 
@Table(name = "user") 
@Inheritance(strategy = JOINED) 
@DiscriminatorColumn(name = "type") 
public abstract class User extends BaseEntity { 

private String email; 

サブクラスの従業員

@Entity 
//@Table(name = "employee") 
@DiscriminatorValue("employee") 
@PrimaryKeyJoinColumn(name = "user_id") 
public class Employee extends User { 

@OneToMany 
@JoinColumn(name="accountant_id") 

private String bsn; 

サブクラスカスタマー

@Entity 
//@Table(name = "customer") 
@DiscriminatorValue("customer") 
@PrimaryKeyJoinColumn(name = "user_id") 
public class Customer extends User { 

@ManyToOne 
@JoinColumn(name="id") 

private BigDecimal balance; 

そして、私のデータベースの作成スキーム

-- user -- 
CREATE TABLE public.user (
    id BIGINT IDENTITY, 
    type VARCHAR (50) NOT NULL, 
    email VARCHAR (50) NOT NULL, 
); 
CREATE UNIQUE INDEX ix_user_email ON public.user(email); 

-- customer -- 
CREATE TABLE public.customer (
    id BIGINT IDENTITY, 
    user_id BIGINT NOT NULL, 
    accountant_id BIGINT, 
    balance NUMERIC(19,2) NOT NULL, 
); 
ALTER TABLE public.customer 
    ADD CONSTRAINT fk_customer_user_id FOREIGN KEY (user_id) REFERENCES public.user(id); 
ALTER TABLE public.customer 
    ADD CONSTRAINT fk_customer_employee_id FOREIGN KEY (accountant_id) REFERENCES public.user(id); 


-- employee -- 
CREATE TABLE public.employee (
    id BIGINT IDENTITY, 
    user_id BIGINT NOT NULL, 
    bsn VARCHAR(9) NOT NULL 
); 
ALTER TABLE public.employee 
    ADD CONSTRAINT fk_employee_user_id FOREIGN KEY (user_id) REFERENCES public.user(id); 
CREATE UNIQUE INDEX ix_employee_bsn ON public.employee(bsn); 

事前に多くの多くのTHANKS!

答えて

1

エラーは言う:@OneToMany、@ManyToManyまたは@CollectionOfElementsのような非コレクションをマッピングする

不正な試みを:nl.mad.w2l2.model.Employee.bsn

対応するコードは

@OneToMany 
@JoinColumn(name="accountant_id") 
private String bsn; 

です。それは意味がありません。 OneToManyは、1人のEmployee(例えば)が多くのタスクを持ち、これらの各タスクがこの従業員だけに属していることをHibernateに伝えるために使用されます。障害がセッションファクトリの作成に表示されている理由、それは移動しようとする上で表示されるはずのかかわら例

@OneToMany 
private Set<Task> tasks; 
+0

のために、私はあなたに同意のように、これは、2つのエンティティタイプ間の関連性だし、それはこのようにエンティティのコレクションに注釈を付ける必要がありますエンティティのコンテキストを維持するか? –

+1

セッション・ファクトリが作成されたときに、Hibernateがどのエンティティを処理しなければならないかを知るためにすべてのマッピングを読み込んで、それらがどのようにして別のものにリンクされているかが原因です。 –

+0

は今 –

関連する問題