Problema di ibernazione - "Utilizzo di @OneToMany o @ManyToMany come target di una classe non mappata"


113

Sto trovando i miei piedi con le annotazioni di ibernazione e ho riscontrato un problema che spero che qualcuno possa aiutare.

Ho 2 entità, Sezione e ScopeTopic. La sezione ha un membro della classe Elenco, quindi una relazione Uno a molti. Quando eseguo il mio unit test ricevo questa eccezione:

Utilizzo di @OneToMany o @ManyToMany come target di una classe non mappata: com.xxx.domain.Section.scopeTopic [com.xxx.domain.ScopeTopic]

Presumo che l'errore implica che la mia entità ScopeTopic non è mappata a una tabella? Non riesco a vedere se ho sbagliato. Ecco le classi di entità:


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

Sono abbastanza sicuro che la colpa sia della mia mancanza di comprensione, quindi un consiglio sarebbe fantastico, grazie!

Risposte:


247

Le tue annotazioni sembrano a posto. Ecco le cose da controllare:

  • assicurati che l'annotazione sia javax.persistence.Entity, e non org.hibernate.annotations.Entity. Il primo rende l'entità rilevabile. Quest'ultimo è solo un'aggiunta.

  • se stai elencando manualmente le tue entità (in persistence.xml, in hibernate.cfg.xml o quando configuri la tua session factory), assicurati di aver elencato anche l' ScopeTopicentità

  • assicurati di non avere più ScopeTopicclassi in pacchetti diversi e di aver importato quella sbagliata.


19
Ah, grazie! Il punto 2 era la chiave, avevo dimenticato di mettere ScopeTopic nel mio elenco di proprietà annotatedClasses durante la creazione di SessionFactory, errore n00b!
C0deAttack

4
Per coloro che hanno appena colpito questo commento. org.hibernate.annotations.Entity è deprecato in Hibernate 4. Il punto 1 non si applica più.
gspatel

Per me era il punto 2, perché ho continuato a modificare hibernate.cfg.xml nella mia cartella di build.
Torsten

In Spring Boot, mi sono imbattuto in un problema qui e il punto 2 è ciò che mi ha aiutato a risolverlo. Avevo lasciato che Spring Boot configurasse automaticamente la mia fabbrica di sessioni e in un ramo avevo aggiunto una nuova entità ... quindi prima che quella venisse unita, avevo un altro ramo in cui dovevo personalizzare la fabbrica di sessioni. Entrambi i rami sono stati uniti contemporaneamente e ho ricevuto l'errore elencato in questo problema. La mia nuova entità non è stata più scansionata automaticamente da Spring Boot poiché avevo configurato la sessionfactory e non pensavo di includere nuove entità da altri rami.
AEvans

Nel mio caso ho dimenticato di scansionare il pacchetto usandopackagesToScan
Siva

24

La mia non aveva @Entityentità dai molti lati

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

22

La tua entità potrebbe non essere elencata nel file di configurazione di ibernazione.


7

Per lo più in Hibernate, è necessario aggiungere la Entityclasse in hibernate.cfg.xmllike-

<hibernate-configuration>
  <session-factory>

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

3

Se stai utilizzando la configurazione Java in un progetto spring-data-jpa, assicurati di eseguire la scansione del pacchetto in cui si trova l'entità. Ad esempio, se l'entità vivesse com.foo.myservice.things, la seguente annotazione di configurazione di seguito non funzionerebbe prendilo.

Puoi risolverlo allentandolo fino a com.foo.myservice (ovviamente, tieni presente qualsiasi altro effetto dell'ampliamento del tuo ambito di scansione per le entità).

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

1

Ho avuto lo stesso problema e ho potuto risolverlo aggiungendo l'entità a persistence.xml. Il problema è stato causato dal fatto che l'entità non è stata aggiunta alla configurazione della persistenza. Modifica il tuo file di persistenza:

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

...


1

Nel mio caso a deve aggiungere le mie classi, quando si costruisce il SessionFactory, conaddAnnotationClass

Configuration configuration.configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration
            .addAnnotatedClass(MyEntity1.class)
            .addAnnotatedClass(MyEntity2.class)
            .buildSessionFactory(builder.build());
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.