Problem z hibernacją - „Użycie @OneToMany lub @ManyToMany do niezamapowanej klasy”

114

Odnajduję się dzięki Hibernate Adnotations i mam problem, z którym mam nadzieję, że ktoś może mi pomóc.

Mam 2 podmioty, sekcję i zakres. Ta sekcja ma członka klasy Lista, więc jest to relacja jeden do wielu. Kiedy uruchamiam test jednostkowy, otrzymuję ten wyjątek:

Użycie @OneToMany lub @ManyToMany w celu kierowania na niezamapowaną klasę: com.xxx.domain.Section.scopeTopic [com.xxx.domain.ScopeTopic]

Zakładam, że błąd oznacza, że ​​moja jednostka ScopeTopic nie jest zamapowana na tabelę? Nie widzę, że postąpiłem źle. Oto klasy 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;
    }
}

Jestem prawie pewien, że winą jest mój własny brak zrozumienia, więc niektóre wskazówki byłyby świetne, dzięki!

C0deAttack
źródło

Odpowiedzi:

248

Twoje adnotacje wyglądają dobrze. Oto rzeczy do sprawdzenia:

  • upewnij się, że adnotacja jest javax.persistence.Entity, a nie org.hibernate.annotations.Entity. To pierwsze sprawia, że ​​istota jest wykrywalna. Ta ostatnia to tylko dodatek.

  • jeśli ręcznie wpisujesz swoje encje (w persistence.xml, w hibernate.cfg.xml lub podczas konfigurowania fabryki sesji), upewnij się, że również wpisałeś ScopeTopicjednostkę

  • upewnij się, że nie masz wielu ScopeTopicklas w różnych pakietach i zaimportowałeś niewłaściwy.

Bozho
źródło
19
Ach, dzięki! Punkt 2 był kluczowy, zapomniałem umieścić ScopeTopic na mojej liście właściwości annotatedClasses podczas tworzenia SessionFactory, błąd n00b!
C0deAttack
4
Dla tych, którzy właśnie trafili na ten komentarz. org.hibernate.annotations.Entity jest przestarzała w Hibernate 4. Punkt 1 nie ma już zastosowania.
gspatel
Dla mnie był to punkt 2, ponieważ kontynuowałem edycję pliku hibernate.cfg.xml w folderze kompilacji.
Torsten,
W Spring Boot natknąłem się tutaj na pułapkę, a punkt 2 pomógł mi go rozwiązać. Pozwalałem Spring Boot na automatyczną konfigurację mojej fabryki sesji, aw jednym oddziale dodałem nową jednostkę ... zanim ta została scalona, ​​miałem inny oddział, w którym musiałem dostosować fabrykę sesji. Obie gałęzie zostały połączone w tym samym czasie i otrzymałem błąd wymieniony w tym problemie. Moja nowa encja nie była już automatycznie skanowana przez rozruch wiosenny, ponieważ skonfigurowałem fabrykę sesji i nie pomyślałem o dołączeniu nowych jednostek z innych oddziałów.
AEvans
W moim przypadku zapomniałem zeskanować paczki za pomocąpackagesToScan
Siva
24

Mój nie miał @Entitybytu z wielu stron

@Entity // this was commented
@Table(name = "some_table")
public class ChildEntity {
    @JoinColumn(name = "parent", referencedColumnName = "id")
    @ManyToOne
    private ParentEntity parentEntity;
}
Youans
źródło
22

Twoja jednostka może nie być wymieniona w pliku konfiguracyjnym hibernacji.

c.sankhala
źródło
7

Przeważnie Hibernatetrzeba dodać Entityklasę w hibernate.cfg.xmlpodobny sposób

<hibernate-configuration>
  <session-factory>

    ....
    <mapping class="xxx.xxx.yourEntityName"/>
 </session-factory>
</hibernate-configuration>
Sai prateek
źródło
3

Jeśli używasz konfiguracji Java w projekcie spring-data-jpa, upewnij się, że skanujesz pakiet, w którym znajduje się jednostka. Na przykład, jeśli jednostka mieszkała com.foo.myservice.things poniższa adnotacja konfiguracji nie będzie Podnieś to.

Możesz to naprawić, poluzowując go do samego com.foo.myservice (oczywiście pamiętaj o innych skutkach poszerzenia zakresu o skanowanie obiektów).

@Configuration
@EnableJpaAuditing
@EnableJpaRepositories("com.foo.myservice.repositories")
public class RepositoryConfiguration {
}
Michael Peterson
źródło
1

Miałem ten sam problem i mogłem go rozwiązać, dodając jednostkę do persistence.xml. Problem został spowodowany tym, że jednostka nie została dodana do konfiguracji trwałości. Edytuj swój plik trwałości:

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

...

enka
źródło
1

W moim przypadku musi dodać moje zajęcia podczas budowy SessionFactory, zaddAnnotationClass

Configuration configuration.configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration
            .addAnnotatedClass(MyEntity1.class)
            .addAnnotatedClass(MyEntity2.class)
            .buildSessionFactory(builder.build());
VLazzarova
źródło