Проблема зі сну у сплячому режимі - "Використання @OneToMany або @ManyToMany націлювання на немапанований клас"


113

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

У мене є 2 сутності, секція та ScopeTopic. У розділі є член класу «Список», тому стосунки «Один до багатьох». Коли я запускаю модульний тест, я отримую такий виняток:

Використання @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;
    }
}

Я майже впевнений, що це моє власне нерозуміння, що винен, тому деякі рекомендації будуть чудовими, дякую!

Відповіді:


247

Ваші анотації виглядають чудово. Ось що потрібно перевірити:

  • переконайтеся, що примітка є javax.persistence.Entity, а ні org.hibernate.annotations.Entity. Перший робить сутність виявленою. Останнє - лише доповнення.

  • якщо ви вручну перераховуєте свої сутності (в persistent.xml, hibernate.cfg.xml або під час налаштування фабрики сеансу), то переконайтеся, що ви також вказали ScopeTopicсутність

  • переконайтеся, що у вас немає декількох ScopeTopicкласів у різних пакетах, а ви імпортували неправильний.


19
Ах, дякую! Точка 2 була ключовою, я забув помістити ScopeTopic у свій список властивостей анотованих класів під час створення помилки SessionFactory, n00b!
C0deAttack

4
Для тих, хто просто вражає цей коментар. org.hibernate.annotations.Entity застаріло в сплячому режимі 4. Пункт 1 більше не застосовується.
gspatel

Для мене це був пункт 2, тому що я продовжував редагувати hibernate.cfg.xml у своїй папці збірки.
Торстен

У Spring 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;
}

22

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


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

У мене була така ж проблема, і я міг її вирішити, додавши сутність у persistent.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());
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.