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


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

у меня есть 2 сущности, раздел и ScopeTopic. Раздел имеет член класса списка, поэтому отношение один ко многим. Когда я запускаю свой модульный тест, я получаю это исключение:

использование @OneToMany или @ ManyToMany для таргетинга на несопоставленный класс: com.ХХХ.домен.Раздел.scopeTopic[com.ХХХ.домен.ScopeTopic]

Я бы предположил, что ошибка подразумевает, что мой объект ScopeTopic не сопоставлен с таблицей? Я не могу видеть, что я сделал неправильно. Вот классы сущностей:


@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;
    }
}

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

6 86

6 ответов:

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

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

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

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

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

моего не было у @Entity на стороне многих сущностей

@Entity // this was commented
@Table(name = "some_table")
public class ChildEntity {
    @JoinColumn(name = "parent", referencedColumnName = "id")
    @ManyToOne
    private ParentEntity parentEntity;
}

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

</hibernate-configuration>
  </session-factory>

    ....
    <mapping class="xxx.xxx.yourEntityName"/>
 </session-factory>
</hibernate-configuration>

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

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

...

в моем случае 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());