Hibernate问题 - “使用@OneToMany或@ManyToMany定位未映射的类”

时间:2011-02-10 12:06:46

标签: hibernate jpa

我找到了Hibernate Annotations的脚,我遇到了一个问题,我希望有人可以提供帮助。

我有2个实体,Section和ScopeTopic。 Section有一个List类成员,所以一对多关系。当我运行我的单元测试时,我得到了这个例外:

  

使用@OneToMany或@ManyToMany定位未映射的类:com.xxx.domain.Section.scopeTopic [com.xxx.domain.ScopeTopic]

我会假设错误意味着我的ScopeTopic实体未映射到表格?我看不到我做错了。以下是实体类:


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

我很确定这是我自己缺乏理解的错误所以一些指导会很棒,谢谢!

8 个答案:

答案 0 :(得分:216)

您的注释看起来很好。以下是要检查的事项:

  • 确保注释为javax.persistence.Entity,而不是org.hibernate.annotations.Entity。前者使实体可检测。后者只是一个补充。

  • 如果您手动列出实体(在persistence.xml中,在hibernate.cfg.xml中,或在配置会话工厂时),请确保您还列出了ScopeTopic实体

  • 确保您在不同的软件包中没有多个ScopeTopic类,并且导入了错误的类。

答案 1 :(得分:19)

您的实体可能未在hibernate配置文件中列出。

答案 2 :(得分:17)

我的多方实体

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

答案 3 :(得分:5)

主要在Hibernate,需要在Entity中添加hibernate.cfg.xml类 -

<hibernate-configuration>
  <session-factory>

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

答案 4 :(得分:2)

如果您在spring-data-jpa项目中使用Java配置,请确保您正在扫描该实体所在的包。例如,如果该实体居住在 com.foo.myservice.things strong>,则下面的以下配置注释将不起作用。

您可以通过将其松散到 com.foo.myservice 来进行修复(当然,请记住扩大您的扫描范围的其他影响)。

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

答案 5 :(得分:0)

我有同样的问题,可以通过将实体添加到persistence.xml中来解决。 该问题是由于没有将实体添加到持久性配置而引起的。编辑您的持久性文件:

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

...

答案 6 :(得分:0)

在我的情况下,使用SessionFactory构建addAnnotationClass时必须添加我的类

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

答案 7 :(得分:0)

检查@Entity 类的包结构。

我也遇到了类似的问题,因为我不小心拼错了包名。

确保所有@Entity 类都位于具有 main() 函数的 Class 包内或下方的包(文件夹)下,因为 SpringBootApplication 将仅扫描同一个包上和内部。

如果你的@Entity 类没有被扫描,它就不会被映射,并且会给出提到的错误。

您还可以通过检查数据库来检查您的@Entity 类是否被正确映射或扫描。每当一个类被标记为@Entity 时,Hibernate/JPA 就会在适用的数据库中自动生成一个表。