Использование @OneToMany или @ManyToMany для нацеливания на несопоставленную ошибку класса из EmbeddedID - PullRequest
1 голос
/ 15 октября 2019

Я использую пружинную загрузку с JPA для простого приложения CRUD.
У меня есть object (ObjectD) с embedded ID (PrimaryKey), который имеет составной первичный ключ, ссылающийся на идентификаторы двух базовых objects (ObjectA and ObjectB) через одно-отношение ко-многим.
Однако я получаю сообщение об ошибке:

org.hibernate.AnnotationException: использование @OneToMany или @ManyToMany для таргетинга на не сопоставленный класс: ObjectA.primarykeys [PrimaryKey].

Кажется, это довольно распространенная проблема, но я попробовал все предложения во всех ответах и ​​не могу пробиться. Помощь будет высоко ценится.

Я прочитал все подобные вопросы и перепробовал все предложения, в том числе:

  • убедился, что аннотация - javax.persistence.Entity, а не org.hibernate.annotations.Entity

  • изменение поля mappedBy на сторонах OneToMany на PrimaryKey.objecta или PrimaryKey.objectb соответственно

  • Я используюSpring boot, поэтому у меня нет файла конфигурации hibernate.cfg или постоянства. Я полагаюсь на пружинную загрузку jpa для выполнения необходимых действий.

Единственный способ запустить ApplicationContext - это удалить поля OneToMany в ObjectA и B соответственно. Но тогда у меня нет ссылки на PrimaryKey от ObjectA и ObjectB, которые мне нужны. Я знаю, что проблема связана с отношением OneToMany, но я не знаю, как ее решить.

Это диаграмма того, что я пытаюсь сделать в базе данных: ORM Класс PrimaryKey предназначен для работы с составным первичным ключом в ObjectD. Вот то, что я пытаюсь сделать с моими сопоставлениями классов для достижения желаемого результата: ORM2

@Entity
public class ObjectA {
    @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(nullable = false) private Long objectAId;

    @OneToMany(mappedBy = "objecta", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    private Set<PrimaryKey> primarykeys = new HashSet<PrimaryKey>();

    @Column(nullable = false, unique = true, length = 200) private String name;

//constructor, getters, setters, equals and hashcode left out for brevity
}   

@Entity
public class ObjectB {
    @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(nullable = false) private Long objectBId;
    @Column(nullable = false, unique = true, length = 200) private String name;
    @OneToMany(mappedBy = "objectb", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
    private Set<PrimaryKey> primaryKeys = new HashSet<PrimaryKey>();

//constructor, getters, setters, equals and hashcode left out for brevity   
}

@Embeddable
public class PrimaryKey implements Serializable {
    private static final long serialVersionUID = 1L;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)  
    @JoinColumn(name="objectAId") 
    private ObjectA objectA;
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name="objectBId") 
    private ObjectB objectB;

//constructor, getters, setters, equals and hashcode left out for brevity
}

@Entity
public class ObjectD {
    @EmbeddedId private PrimaryKey primaryKey;
    @Column(nullable = false, unique = true, length = 200) private String name;

//constructor, getters, setters, equals and hashcode left out for brevity
}

Я вставил трассировку стека ниже.

2019-10-15 11: 39: 06,203 ОШИБКА [main] org.springframework.boot.SpringApplication: сбой запуска приложения org.springframework.beans.factory.BeanCreationException: ошибка создания бина с именем 'entityManagerFactory ', определенный в ресурсе пути к классу [org / springframework / boot / autoconfigure / orm / jpa / HibernateJpaConfiguration.class]: сбой вызова метода init;вложенное исключение - org.hibernate.AnnotationException: использование @OneToMany или @ManyToMany для таргетинга на несопоставленный класс: ObjectA.primarykeys [PrimaryKey] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFaseBeBeBeBeBeBeBeOFBF ().springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:573) при org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:495) в org.springframework.beans.factory.support.AbstractBeanFactory.lambda $ doGetBean $ 0 (AbstractBeanFactory.java:317) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:22ory.beebAbstractBeanFactory.java:315) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) по адресу org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1087) по адресу org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryjt.jpg.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:548) при org.springframework.boot.SpringApplication.refresh (SpringApplication.java:754) в org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:386) в орг. springframework.boot.SpringApplication.run (SpringApplication.java:307)на org.springframework.boot.test.context.SpringBootContextLoader.loadContext (SpringBootContextLoader.java:127) в org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal (DefaultCacheAwareContextLoaderDelegate.java:99) в org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext (DefaultCacheAwareContextLoaderDelegate.java:117) при org.springframework.test.context.support.DefaultTestContext.getApplicationContext (DefaultTestContext.java:108) в org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary (ServletTestExecutionListener0test.context.junit4.SpringJUnit4ClassRunner.createTest (SpringJUnit4ClassRunner.java:227) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner $ 1.runReflectiveCall (SpringJUnit4ClassRunner.java:289) в org.junit.internal.runners.model.ReflectiveCallable.run:f. context.junit4.SpringJUnit4ClassRunner.methodBlock (SpringJUnit4ClassRunner.java:291) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ildit.unj.rajSpringJUnit4ClassRunner.java:97) в org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) в org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) в org.junit.runners.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) в org.junit.runners.ParentRunner $ 2.оценки (ParentRunner.java:268) в org.springtest.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate (RunBeforeTestClassCallbacks.java:61)в org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate (RunAfterTestClassCallbacks.java:70) в org.junit.runners.ParentRunner.run (ParentRunner.java:363) в org.sjt. .SpringJUnit4ClassRunner.run (SpringJUnit4ClassRunner.java:190) в org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:89.tun.jun). (TestExecution.java:41) по адресу org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:541) по адресу org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.RemoteTestRunner.RemoteTestRunner.Re: 763) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:463) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner) Caujby: org.hibernate.AnnotationException: использование @OneToMany или @ManyToMany для таргетинга на не сопоставленный класс: ObjectA.primarykeys [PrimaryKey] в org.hibernate.cfg.anНотации. InFlightMetadataCollectorImpl.java:1608) в org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete (MetadataBuildingProcess.java:278)в org.hibernate.jpa.boot.internal. .vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory (SpringHibernateJpaPersistenceProvider.java:57) при org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory (LocalContainerEntityManagerFactoryBean.java:365) в org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory (AbstractEntityManagerFactoryBean.java:390) в org.springframework.orm.jpa. АбстрактныеAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1753) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean: 40-main] org.springframework.test.context.TestContextManager: возникла исключительная ситуация при разрешении TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener@7193666c] для подготовки тестового экземпляра [hysan.test.integrationtests.Tegration.integration.bte] java.lang.IllegalStateException: не удалось загрузить ApplicationContext по адресу org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext (DefaultCacheAwareContextLoaderDelegate.java:12.estContext.txt) для org.sprxttetef: 108) в org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNeeded (ServletTestExecutionListener.java:190) в org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance (ServletTestExecutionListener.java:132) в org.springframework.est.st_p_t_t_t_t_t_t_t_t_t_t_t_t_t_t_t_t_t_t_t_t_t_t_t_2.test.context.junit4.SpringJUnit4ClassRunner.createTest (SpringJUnit4ClassRunner.java:227) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner $ 1.run.ReflectivenritReflectiveCallable.run (ReflectiveCallable.java:12) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock (SpringJUnit4ClassRunner.java:291) в org.springframeitj.junCunCunRunSunRunSun.Run246) по адресу org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRunner.java:97) по адресу org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:jg.ru или 2000)nners.ParentRunner $ 1.schedule (ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58).junit.runners.ParentRunner $ 2высказывания.RunAfterTestClassCallbacks.evaluate (RunAfterTestClassCallbacks.java:70) в org.junit.runners.ParentRunner.run (ParentRunner.java:363) в org.springframework.test.context.junit4.SpringJRjun.rn.Ruв org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:89)на org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:41) на org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:54lse или.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:763) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:463) в org.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:209)

1 Ответ

0 голосов
/ 15 октября 2019

@OneToMany нельзя применить к @Embeddable, только к @Entity.

Другими словами, вы не можете написать это:

@OneToMany(mappedBy = "objecta", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
private Set<PrimaryKey> primarykeys = new HashSet<PrimaryKey>();

Если это встраиваемое - вставьте его!

...