web-dev-qa-db-fra.com

Problème Hibernate - "Utilisation de @OneToMany ou @ManyToMany ciblant une classe non mappée"

Je trouve mes pieds avec Hibernate Annotations et je rencontre un problème que j'espère pouvoir aider.

J'ai 2 entités, Section et ScopeTopic. La section a un membre de la classe List, donc une relation un à plusieurs. Lorsque j'effectue mon test unitaire, j'obtiens cette exception:

Utilisation de @OneToMany ou @ManyToMany visant une classe non mappée: com.xxx.domain.Section.scopeTopic [com.xxx.domain.ScopeTopic]

Je suppose que l'erreur implique que mon entité ScopeTopic n'est pas mappée à une table? Je ne peux pas voir avec j'ai mal fait. Voici les classes d'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;
    }
}

Je suis à peu près sûr que c'est mon manque de compréhension qui est en cause, alors quelques conseils seraient bien, merci!

90
C0deAttack

Vos annotations ont l'air bien. Voici les points à vérifier:

  • assurez-vous que l'annotation est javax.persistence.Entity et non org.hibernate.annotations.Entity. Le premier rend l'entité détectable. Ce dernier n'est qu'un ajout.

  • si vous listez manuellement vos entités (dans persistence.xml, hibernate.cfg.xml ou lors de la configuration de votre fabrique de session), assurez-vous que vous avez également répertorié l'entité ScopeTopic.

  • assurez-vous que vous n'avez pas plusieurs classes ScopeTopic dans différents packages et que vous avez importé le mauvais.

209
Bozho

Votre entité peut ne pas être répertoriée dans le fichier de configuration Hibernate.

19
ChetanSankhala

Le mien n'était pas @Entity sur l'entité latérale multiple

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

Généralement dans Hibernate, il faut ajouter la classe Entity dans hibernate.cfg.xml comme- 

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

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

J'avais le même problème et je pouvais le résoudre en ajoutant l'entité dans persistence.xml . Le problème était dû au fait que l'entité n'avait pas été ajoutée à la configuration de persistance. Editez votre fichier de persistance:

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

...

0
enka

Si vous utilisez la configuration Java dans un projet spring-data-jpa, assurez-vous d’analyser le package contenant l’entité. Par exemple, si l’entité vivait com.foo.myservice .things alors l'annotation de configuration suivante ci-dessous ne la prendra pas.

Vous pouvez le réparer en le relâchant juste com.foo.myservice (bien sûr, gardez à l'esprit tout autre effet d'élargir votre champ d'application pour rechercher des entités).

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

Dans mon cas, a doit ajouter mes classes lors de la construction de SessionFactory, avec addAnnotationClass

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