Проблема спящего режима - "Использование @OneToMany или @ManyToMany для таргетинга на немаркированный класс"
Я нахожу свои ноги с аннотациями Hibernate, и я попал в проблему. Надеюсь, кто-то может помочь.
У меня есть 2 объекта, раздел и область ScopeTopic. Раздел имеет член класса List, поэтому отношение "Один ко многим". Когда я запускаю свой unit test, я получаю это исключение:
Использование @OneToMany или @ManyToMany для таргетинга на неотображенный класс: com.xxx.domain.Section.scopeTopic [com.xxx.domain.ScopeTopic]
Я бы предположил, что ошибка подразумевает, что мой объект ScopeTopic не сопоставляется с таблицей? Я не вижу, что я сделал не так. Вот классы Entity:
@Entity
public class Section {
private Long id;
private List<ScopeTopic> scopeTopics;
public Section() {}
@Id
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@OneToMany
@JoinTable(name = "section_scope", joinColumns = {@JoinColumn(name="section_id")},
inverseJoinColumns = {@JoinColumn(name="scope_topic_id")} )
public List<ScopeTopic> getScopeTopic() {
return scopeTopic;
}
public void setScopeTopic(List<ScopeTopic> scopeTopic) {
this.scopeTopic = scopeTopic;
}
}
@Entity
@Table(name = "scope_topic")
public class ScopeTopic {
private Long id;
private String topic;
public ScopeTopic() {}
@Id
public Long getId() {
return id;
}
public void setId() {
this.id = id;
}
public String getTopic() {
return topic;
}
public void setTopic(String topic) {
this.topic = topic;
}
}
Я уверен, что это мое собственное отсутствие понимания, что по вине, поэтому некоторые рекомендации будут замечательными, спасибо!
Ответы
Ответ 1
Ваши аннотации выглядят прекрасно. Вот что нужно проверить:
-
убедитесь, что аннотация javax.persistence.Entity
, а не org.hibernate.annotations.Entity
. Первый делает сущность обнаружимой. Последнее является просто дополнением.
-
если вы вручную указываете свои объекты (в файле persistence.xml, в файле hibernate.cfg.xml или при настройке сеанса factory), убедитесь, что вы также указали объект ScopeTopic
-
убедитесь, что у вас нет нескольких классов ScopeTopic
в разных пакетах, и вы импортировали неправильный.
Ответ 2
У @Entity
не было @Entity
на многих сторонних @Entity
@Entity // this was commented
@Table(name = "some_table")
public class ChildEntity {
@JoinColumn(name = "parent", referencedColumnName = "id")
@ManyToOne
private ParentEntity parentEntity;
}
Ответ 3
Ваша сущность не может быть указана в конфигурационном файле hibernate.
Ответ 4
В основном в Hibernate
, нужно добавить класс Entity
в hibernate.cfg.xml
like-
<hibernate-configuration>
<session-factory>
....
<mapping class="xxx.xxx.yourEntityName"/>
</session-factory>
</hibernate-configuration>
Ответ 5
У меня была та же проблема, и я мог решить ее, добавив объект в файл persistence.xml. Проблема была вызвана тем, что объект не был добавлен в конфигурацию постоянства. Отредактируйте свой файл постоянства:
<persistence-unit name="MY_PU" transaction-type="RESOURCE_LOCAL">
<provider>'enter code here'
org.hibernate.jpa.HibernatePersistenceProvider
</provider>
<class>mypackage.MyEntity</class>
...
Ответ 6
В моем случае a должен добавить мои классы при построении SessionFactory
с помощью addAnnotationClass
Configuration configuration.configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration
.addAnnotatedClass(MyEntity1.class)
.addAnnotatedClass(MyEntity2.class)
.buildSessionFactory(builder.build());
Ответ 7
Если вы используете конфигурацию Java в проекте spring-data-jpa, убедитесь, что вы сканируете пакет, в котором находится объект. Например, если объект жил com.foo.myservice.things, тогда нижеприведенная аннотация конфигурации не поднимет его.
Вы можете исправить это, ослабив его до значения com.foo.myservice (разумеется, не забывайте о любых других эффектах расширения области действия для поиска сущностей).
@Configuration
@EnableJpaAuditing
@EnableJpaRepositories("com.foo.myservice.repositories")
public class RepositoryConfiguration {
}