Я использую пружинную загрузку с 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, но я не знаю, как ее решить.
Это диаграмма того, что я пытаюсь сделать в базе данных: Класс PrimaryKey предназначен для работы с составным первичным ключом в ObjectD. Вот то, что я пытаюсь сделать с моими сопоставлениями классов для достижения желаемого результата:
@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)