Проблема гибернации - «Использование @OneToMany или @ManyToMany для таргетинга на несопоставленный класс»

114

Я нахожусь на ногах с Hibernate Annotations, и у меня возникла проблема, с которой, надеюсь, кто-то может помочь.

У меня есть 2 объекта: Section и ScopeTopic. В разделе есть член класса List, поэтому отношение «один ко многим». Когда я запускаю свой модульный тест, я получаю следующее исключение:

Использование @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;
    }
}

Я почти уверен, что это мое собственное непонимание, поэтому некоторые рекомендации были бы отличными, спасибо!

C0deAttack
источник

Ответы:

248

Ваши аннотации выглядят нормально. Вот что нужно проверить:

  • убедитесь, что аннотация есть javax.persistence.Entity, а не org.hibernate.annotations.Entity. Первое делает сущность обнаруживаемой. Последнее просто дополнение.

  • если вы вручную перечисляете свои сущности (в persistence.xml, в hibernate.cfg.xml или при настройке фабрики сеансов), убедитесь, что вы также указали ScopeTopicсущность

  • убедитесь, что у вас нет нескольких ScopeTopicклассов в разных пакетах, и вы импортировали не тот.

Bozho
источник
19
Ах, спасибо! Пункт 2 был ключевым, я забыл поместить ScopeTopic в свой список свойств annotatedClasses при создании SessionFactory, ошибка n00b!
C0deAttack
4
Для тех, кто только что нажал на этот комментарий. org.hibernate.annotations.Entity устарел в Hibernate 4. Пункт 1 больше не применяется.
gspatel
Для меня это был пункт 2, потому что я продолжал редактировать hibernate.cfg.xml в своей папке сборки.
Торстен
В Spring Boot я столкнулся с ошибкой, и пункт 2 помог мне решить ее. Я позволял Spring Boot автоматически настраивать мою фабрику сеансов, и в одну ветку я добавил новую сущность ... затем, до того, как она была объединена, у меня была другая ветка, в которой мне нужно было настроить фабрику сеансов. Обе ветки были объединены одновременно, и я получил ошибку, указанную в этой проблеме. Моя новая сущность больше не сканировалась автоматически при весенней загрузке, так как я настроил фабрику сеансов и не думал включать новые сущности из других веток.
AEvans
В моем случае я забыл просканировать пакет с помощьюpackagesToScan
Siva
24

У меня не @Entityбыло много сторонней организации

@Entity // this was commented
@Table(name = "some_table")
public class ChildEntity {
    @JoinColumn(name = "parent", referencedColumnName = "id")
    @ManyToOne
    private ParentEntity parentEntity;
}
Youans
источник
22

Ваша организация может не отображаться в файле конфигурации гибернации.

c.sankhala
источник
7

В основном в Hibernate, необходимо добавить Entityкласс в hibernate.cfg.xmlкак-

<hibernate-configuration>
  <session-factory>

    ....
    <mapping class="xxx.xxx.yourEntityName"/>
 </session-factory>
</hibernate-configuration>
Сай Пратик
источник
3

Если вы используете конфигурацию Java в проекте spring-data-jpa, убедитесь, что вы сканируете пакет, в котором находится объект. Например, если объект жил com.foo.myservice.things, то следующая аннотация конфигурации ниже не будет возьми это.

Вы можете исправить это, расширив его до com.foo.myservice (конечно, помните о любых других эффектах расширения области действия для сканирования объектов).

@Configuration
@EnableJpaAuditing
@EnableJpaRepositories("com.foo.myservice.repositories")
public class RepositoryConfiguration {
}
Майкл Петерсон
источник
1

У меня была такая же проблема, и я мог решить ее, добавив объект в persistence.xml. Проблема возникла из-за того, что объект не был добавлен в конфигурацию сохраняемости. Отредактируйте файл сохранения:

<persistence-unit name="MY_PU" transaction-type="RESOURCE_LOCAL">
<provider>`enter code here`
     org.hibernate.jpa.HibernatePersistenceProvider
  </provider>
<class>mypackage.MyEntity</class>

...

Энка
источник
1

В моем случае нужно добавить мои классы при построении SessionFactoryсaddAnnotationClass

Configuration configuration.configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration
            .addAnnotatedClass(MyEntity1.class)
            .addAnnotatedClass(MyEntity2.class)
            .buildSessionFactory(builder.build());
В.Лаззарова
источник