Problem im Ruhezustand - "Verwendung von @OneToMany oder @ManyToMany für eine nicht zugeordnete Klasse"

112

Ich finde meine Füße mit Hibernate Annotations und bin auf ein Problem gestoßen, bei dem hoffentlich jemand helfen kann.

Ich habe 2 Entitäten, Section und ScopeTopic. Der Abschnitt hat ein List-Klassenmitglied, also eine Eins-zu-Viele-Beziehung. Wenn ich meinen Komponententest durchführe, wird folgende Ausnahme angezeigt:

Verwendung von @OneToMany oder @ManyToMany für eine nicht zugeordnete Klasse: com.xxx.domain.Section.scopeTopic [com.xxx.domain.ScopeTopic]

Ich würde annehmen, dass der Fehler impliziert, dass meine ScopeTopic-Entität keiner Tabelle zugeordnet ist. Ich kann nicht sehen, dass ich etwas falsch gemacht habe. Hier sind die Entitätsklassen:


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

Ich bin mir ziemlich sicher, dass mein eigener Mangel an Verständnis schuld ist, daher wäre eine Anleitung großartig, danke!

C0deAttack
quelle

Antworten:

246

Ihre Anmerkungen sehen gut aus. Hier sind die Dinge zu überprüfen:

  • Stellen Sie sicher, dass die Anmerkung ist javax.persistence.Entityund nichtorg.hibernate.annotations.Entity . Ersteres macht die Entität erkennbar. Letzteres ist nur eine Ergänzung.

  • Wenn Sie Ihre Entitäten manuell auflisten (in persistence.xml, in hibernate.cfg.xml oder bei der Konfiguration Ihrer Session Factory), stellen Sie sicher, dass Sie auch die aufgelistet haben ScopeTopic Entität

  • Stellen Sie sicher, dass Sie nicht mehrere ScopeTopicKlassen in verschiedenen Paketen haben und die falsche importiert haben.

Bozho
quelle
19
Ah danke! Punkt 2 war der Schlüssel, ich hatte vergessen, ScopeTopic in meine annotatedClasses-Eigenschaftsliste aufzunehmen, als ich den SessionFactory, n00b-Fehler erstellte!
C0deAttack
4
Für diejenigen, die nur diesen Kommentar treffen. org.hibernate.annotations.Entity ist in Hibernate 4 veraltet. Punkt 1 gilt nicht mehr.
gspatel
Für mich war es Punkt 2, weil ich die Datei hibernate.cfg.xml in meinem Build-Ordner weiter bearbeitet habe.
Torsten
In Spring Boot bin ich hier auf ein Problem gestoßen, und Punkt 2 hat mir geholfen, es zu lösen. Ich hatte Spring Boot meine Sitzungsfactory automatisch konfigurieren lassen, und in einem Zweig hatte ich eine neue Entität hinzugefügt. Bevor diese zusammengeführt wurde, hatte ich einen anderen Zweig, in dem ich die Sitzungsfactory anpassen musste. Beide Zweige wurden gleichzeitig zusammengeführt und ich habe den in diesem Problem aufgeführten Fehler erhalten. Meine neue Entität wurde vom Spring Boot nicht mehr automatisch gescannt, da ich die Sessionfactory konfiguriert hatte und nicht daran dachte, neue Entitäten aus anderen Zweigen aufzunehmen.
AEvans
In meinem Fall habe ich vergessen, das Paket mitpackagesToScan
Siva
24

Meins hatte nicht @Entityauf der vielen Seite Entität

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

Ihre Entität ist möglicherweise nicht in der Konfigurationsdatei für den Ruhezustand aufgeführt.

c.sankhala
quelle
7

Meistens Hibernatemuss die EntityKlasse in hibernate.cfg.xmllike- hinzugefügt werden.

<hibernate-configuration>
  <session-factory>

    ....
    <mapping class="xxx.xxx.yourEntityName"/>
 </session-factory>
</hibernate-configuration>
Sai Prateek
quelle
3

Wenn Sie die Java-Konfiguration in einem spring-data-jpa-Projekt verwenden, stellen Sie sicher, dass Sie das Paket scannen, in dem sich die Entität befindet. Wenn die Entität beispielsweise com.foo.myservice.things lebte, würde die folgende Konfigurationsanmerkung dies nicht tun Heb es auf.

Sie können das Problem beheben, indem Sie es auf com.foo.myservice lockern (natürlich sollten Sie auch andere Auswirkungen einer Erweiterung Ihres Bereichs berücksichtigen, um nach Entitäten zu suchen ).

@Configuration
@EnableJpaAuditing
@EnableJpaRepositories("com.foo.myservice.repositories")
public class RepositoryConfiguration {
}
Michael Peterson
quelle
1

In meinem Fall muss a meine Klassen beim Erstellen der SessionFactorymit hinzufügenaddAnnotationClass

Configuration configuration.configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration
            .addAnnotatedClass(MyEntity1.class)
            .addAnnotatedClass(MyEntity2.class)
            .buildSessionFactory(builder.build());
VLazzarova
quelle
0

Ich hatte das gleiche Problem und konnte es lösen, indem ich die Entität in persistence.xml hinzufügte. Das Problem wurde dadurch verursacht, dass die Entität nicht zur Persistenzkonfiguration hinzugefügt wurde. Bearbeiten Sie Ihre Persistenzdatei:

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

...

enka
quelle