Problema de Hibernate - “Uso de @OneToMany ou @ManyToMany visando uma classe não mapeada”

113

Estou me acostumando com as anotações do Hibernate e encontrei um problema no qual espero que alguém possa ajudar.

Eu tenho 2 entidades, Seção e ScopeTopic. A seção tem um membro da classe List, portanto, um relacionamento Um para Muitos. Quando executo meu teste de unidade, recebo esta exceção:

Uso de @OneToMany ou @ManyToMany visando uma classe não mapeada: com.xxx.domain.Section.scopeTopic [com.xxx.domain.ScopeTopic]

Eu presumiria que o erro implica que minha entidade ScopeTopic não está mapeada para uma tabela. Não consigo ver se fiz algo errado. Aqui estão as classes de Entidade:


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

Tenho certeza de que é minha própria falta de compreensão que está em falta, então alguma orientação seria ótima, obrigado!

C0deAttack
fonte

Respostas:

247

Suas anotações parecem boas. Aqui estão os itens a verificar:

  • certifique-se de que a anotação é javax.persistence.Entity, e não org.hibernate.annotations.Entity. O primeiro torna a entidade detectável. Este último é apenas um acréscimo.

  • se você estiver listando manualmente suas entidades (em persistence.xml, em hibernate.cfg.xml, ou ao configurar sua fábrica de sessão), certifique-se de ter listado também a ScopeTopicentidade

  • certifique-se de não ter várias ScopeTopicclasses em pacotes diferentes e importou o errado.

Bozho
fonte
19
Ah, obrigado! O ponto 2 era a chave, eu tinha esquecido de colocar ScopeTopic na minha lista de propriedades annotatedClasses ao criar a SessionFactory, erro n00b!
C0deAttack de
4
Para aqueles que estão apenas acessando este comentário. org.hibernate.annotations.Entity está obsoleto no Hibernate 4. O ponto 1 não se aplica mais.
gspatel
Para mim foi o ponto 2, porque continuei editando o hibernate.cfg.xml na minha pasta de build.
Torsten
No Spring Boot, encontrei um problema aqui, e o ponto 2 é o que me ajudou a resolvê-lo. Eu deixava o Spring Boot configurar automaticamente minha fábrica de sessão e em um branch eu adicionei uma nova entidade ... então, antes que essa fosse mesclada, eu tinha outro branch onde eu tinha que personalizar a fábrica de sessão. Ambas as ramificações foram mescladas ao mesmo tempo e recebi o erro listado neste problema. Minha nova entidade não era mais verificada automaticamente pelo Spring Boot, pois eu havia configurado a sessionfactory e não pensei em incluir novas entidades de outros branches.
AEvans
No meu caso, esqueci de escanear o pacote usandopackagesToScan
Siva
24

O meu não tinha @Entityna entidade muitos lados

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

Sua entidade pode não estar listada no arquivo de configuração de hibernação.

c.sankhala
fonte
7

Principalmente em Hibernate, necessidade de adicionar a Entityclasse em hibernate.cfg.xmlcomo-

<hibernate-configuration>
  <session-factory>

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

Se você estiver usando a configuração Java em um projeto spring-data-jpa, certifique-se de escanear o pacote em que a entidade está. Por exemplo, se a entidade vivesse com.foo.myservice.things , a seguinte anotação de configuração abaixo não pegar.

Você pode corrigi-lo abrindo-o para apenas com.foo.myservice (claro, lembre-se de quaisquer outros efeitos de ampliar seu escopo para verificar entidades).

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

Eu tive o mesmo problema e poderia resolvê-lo adicionando a entidade em persistence.xml. O problema foi causado porque a entidade não foi adicionada à configuração de persistência. Edite seu arquivo de persistência:

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

...

enka
fonte
1

No meu caso, um tem que adicionar minhas classes, ao construir o SessionFactory, comaddAnnotationClass

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