Problème de mise en veille prolongée - "Utilisation de @OneToMany ou @ManyToMany ciblant une classe non mappée"

114

Je trouve mes marques avec les annotations Hibernate et j'ai rencontré un problème auquel j'espère que quelqu'un pourra m'aider.

J'ai 2 entités, Section et ScopeTopic. La section a un membre de classe List, donc une relation un à plusieurs. Lorsque j'exécute 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 que 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 propre manque de compréhension qui est en faute, alors quelques conseils seraient formidables, merci!

C0deAttack
la source

Réponses:

248

Vos annotations semblent correctes. Voici les choses à 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, dans hibernate.cfg.xml, ou lors de la configuration de votre fabrique de session), assurez-vous que vous avez également répertorié l' ScopeTopicentité

  • assurez-vous que vous n'avez pas plusieurs ScopeTopicclasses dans différents packages et que vous avez importé la mauvaise.

Bozho
la source
19
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 n00b!
C0deAttack
4
Pour ceux qui viennent de frapper ce commentaire. org.hibernate.annotations.Entity est obsolète dans Hibernate 4. Le point 1 ne s'applique plus.
gspatel
Pour moi, c'était le point 2, car je continuais à éditer le hibernate.cfg.xml dans mon dossier de construction.
Torsten
Dans Spring Boot, je suis tombé sur un piège ici, et le point 2 m'a aidé à le résoudre. J'avais laissé Spring Boot configurer automatiquement ma fabrique de session, et dans une branche j'avais ajouté une nouvelle entité ... puis avant que celle-ci ne soit fusionnée, j'avais une autre branche où je devais personnaliser la fabrique de session. Les deux branches ont fusionné en même temps et j'ai obtenu l'erreur répertoriée dans ce problème. Ma nouvelle entité n'était plus auto-scannée par spring boot car j'avais configuré la sessionfactory et je n'avais pas pensé à inclure de nouvelles entités d'autres branches.
AEvans
Dans mon cas, j'ai oublié de scanner le paquet en utilisantpackagesToScan
Siva
24

Le mien n'avait pas d' @Entityentité côté multiple

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

Votre entité peut ne pas être répertoriée dans le fichier de configuration de mise en veille prolongée.

c.sankhala
la source
7

Surtout dans Hibernate, besoin d'ajouter la Entityclasse hibernate.cfg.xmlcomme-

<hibernate-configuration>
  <session-factory>

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

Si vous utilisez la configuration Java dans un projet spring-data-jpa, assurez-vous que vous analysez le package dans lequel se trouve l'entité. Par exemple, si l'entité vivait com.foo.myservice.things, l'annotation de configuration suivante ci-dessous ne serait pas ramasser.

Vous pouvez le résoudre en le relâchant jusqu'à com.foo.myservice (bien sûr, gardez à l'esprit tous les autres effets de l'élargissement de votre portée pour rechercher des entités).

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

J'ai eu le même problème et j'ai pu le résoudre en ajoutant l'entité dans persistence.xml. Le problème est dû au fait que l'entité n'a pas été ajoutée à la configuration de persistance. Modifiez 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>

...

enka
la source
1

Dans mon cas , un a ajouter mes classes, lors de la construction de la SessionFactory, avecaddAnnotationClass

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