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!
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.
Votre entité peut ne pas être répertoriée dans le fichier de configuration Hibernate.
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;
}
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>
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>
...
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 {
}
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());