131 votes

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

Je me familiarise avec les annotations Hibernate et j'ai rencontré un problème qui, je l'espère, pourra être résolu.

J'ai deux entités, Section et ScopeTopic. La section a un membre de la classe List, donc une relation de type One to Many. Lorsque je lance mon test unitaire, j'obtiens cette exception :

Utilisation de @OneToMany ou @ManyToMany ciblant 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 vois pas ce que j'ai fait de mal. Voici les classes d'entités :


@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 presque sûr que c'est mon propre manque de compréhension qui est en cause, alors quelques conseils seraient les bienvenus, merci !

276voto

Bozho Points 273663

Vos annotations semblent correctes. Voici les éléments à vérifier :

  • s'assurer que l'annotation est javax.persistence.Entity et non org.hibernate.annotations.Entity . Le premier rend l'entité détectable. La seconde n'est qu'un ajout.

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

  • assurez-vous que vous n'avez pas plusieurs ScopeTopic dans différents paquets, et vous avez importé la mauvaise classe.

23 votes

Ah, merci ! Le point 2 était la clé, j'avais oublié de mettre ScopeTopic dans ma liste de propriétés annotatedClasses lors de la création de SessionFactory, erreur de n00b !

4 votes

Pour ceux qui viennent de lire ce commentaire, org.hibernate.annotations.Entity est déprécié dans Hibernate 4. Le point 1 ne s'applique plus.

0 votes

Pour moi, c'était le point 2, parce que j'ai continué à modifier le fichier hibernate.cfg.xml dans mon dossier de construction.

40voto

YouYou Points 965

Le mien n'avait pas @Entity sur l'entité many side

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

28voto

chetan.sankhala Points 346

Votre entité n'est peut-être pas répertoriée dans le fichier de configuration d'Hibernate.

12voto

Sai prateek Points 760

Principalement en Hibernate il faut ajouter le Entity classe dans hibernate.cfg.xml comme-

<hibernate-configuration>
  <session-factory>

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

4voto

P1X3L5 Points 1778

Si vous utilisez une configuration Java dans un projet spring-data-jpa, assurez-vous que vous analysez le paquet dans lequel se trouve l'entité. Par exemple, si l'entité a vécu com.foo.myservice.things alors l'annotation de configuration suivante ne le reprendrait pas.

Vous pourriez le réparer en le desserrant pour juste com.foo.myservice (bien sûr, gardez à l'esprit tous les autres effets de l'élargissement de votre champ d'action à la recherche d'entités).

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X