Проблема спящего режима - "Использование @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 {
}