Problema de hibernación: "Uso de @OneToMany o @ManyToMany dirigido a una clase no asignada"

113

Me encuentro bien con las anotaciones de Hibernate y he encontrado un problema con el que espero que alguien pueda ayudarme.

Tengo 2 entidades, Section y ScopeTopic. La sección tiene un miembro de la clase List, por lo que una relación de uno a muchos. Cuando ejecuto mi prueba unitaria, obtengo esta excepción:

Uso de @OneToMany o @ManyToMany para una clase no asignada: com.xxx.domain.Section.scopeTopic [com.xxx.domain.ScopeTopic]

¿Asumiría que el error implica que mi entidad ScopeTopic no está asignada a una tabla? No puedo ver con lo que hice mal. Aquí están las clases de entidad:


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

Estoy bastante seguro de que es mi propia falta de comprensión lo que tiene la culpa, así que alguna orientación sería genial, ¡gracias!

C0deAttack
fuente

Respuestas:

247

Tus anotaciones se ven bien. Estas son las cosas que debe verificar:

  • asegúrese de que la anotación sea javax.persistence.Entity, y no org.hibernate.annotations.Entity. El primero hace que la entidad sea detectable. Este último es solo una adición.

  • si está enumerando manualmente sus entidades (en persistence.xml, en hibernate.cfg.xml, o al configurar su fábrica de sesiones), asegúrese de haber incluido también la ScopeTopicentidad

  • asegúrese de no tener varias ScopeTopicclases en diferentes paquetes y de haber importado la incorrecta.

Bozho
fuente
19
¡Ah gracias! El punto 2 era la clave, me había olvidado de poner ScopeTopic en mi lista de propiedades annotatedClasses al crear SessionFactory, ¡error n00b!
C0deAttack
4
Para aquellos que simplemente presionan este comentario. org.hibernate.annotations.Entity está obsoleto en Hibernate 4. El punto 1 ya no se aplica.
gspatel
Para mí fue el punto 2, porque seguí editando hibernate.cfg.xml en mi carpeta de compilación.
Torsten
En Spring Boot, me encontré con un problema aquí, y el punto 2 es lo que me ayudó a resolverlo. Había estado dejando que Spring Boot configurara automáticamente mi fábrica de sesiones, y en una rama había agregado una nueva entidad ... luego, antes de que se fusionara, tenía otra rama en la que tenía que personalizar la fábrica de sesiones. Ambas ramas se fusionaron al mismo tiempo y obtuve el error que aparece en este problema. Spring Boot ya no escaneó automáticamente mi nueva entidad, ya que había configurado sessionfactory y no pensé en incluir nuevas entidades de otras ramas.
AEvans
En mi caso, olvidé escanear el paquete usandopackagesToScan
Siva
24

El mío no tenía @Entityen la entidad de muchos lados

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

Es posible que su entidad no aparezca en el archivo de configuración de hibernación.

c.sankhala
fuente
7

Principalmente Hibernate, es necesario agregar la Entityclase en hibernate.cfg.xmllike-

<hibernate-configuration>
  <session-factory>

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

Si está utilizando la configuración de Java en un proyecto spring-data-jpa, asegúrese de que está escaneando el paquete en el que se encuentra la entidad. Por ejemplo, si la entidad vivía com.foo.myservice.things , la siguiente anotación de configuración a continuación no lo haría recógelo.

Puede solucionarlo aflojándolo a solo com.foo.myservice (por supuesto, tenga en cuenta cualquier otro efecto de ampliar su alcance para buscar entidades).

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

En mi caso, tengo que agregar mis clases, al construir el SessionFactory, conaddAnnotationClass

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

Tuve el mismo problema y pude resolverlo agregando la entidad en persistence.xml. El problema se debió al hecho de que la entidad no se agregó a la configuración de persistencia. Edite su archivo de persistencia:

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

...

enka
fuente