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


112

我正在使用“休眠注释”找到自己的脚,并且遇到了一个问题,希望有人可以提供帮助。

我有2个实体,分别是Section和ScopeTopic。该部分具有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;
    }
}

我很确定这是我自己的理解不足造成的,所以一些指导会很棒,谢谢!

Answers:


246

您的注释看起来不错。这里是要检查的东西:

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

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

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


19
啊,谢谢!第2点是关键,在创建SessionFactory时,我忘记将ScopeTopic放在我的annotatedClasses属性列表中,n00b错误!
C0deAttack 2011年

4
对于那些刚刚发表评论的人。在Hibernate 4中已弃用org.hibernate.annotations.Entity。第1点不再适用。
gspatel

对我而言,这是第2点,因为我继续在build文件夹中编辑hibernate.cfg.xml。
2015年

在Spring Boot中,我遇到了一个难题,第2点是帮助我解决问题的原因。我一直在让Spring Boot自动配置我的会话工厂,然后在一个分支中添加了一个新实体...然后在合并这个实体之前,我在另一个分支中必须自定义会话工厂。两个分支同时合并,并且我收到了此问题中列出的错误。由于我已经配置了sessionfactory并且不考虑包含其他分支的新实体,因此我的新实体不再由spring boot进行自动扫描。
AEvans

就我而言,我忘了使用packagesToScan
Siva

24

我的没有@Entity多方面的实体

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


7

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

<hibernate-configuration>
  <session-factory>

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

3

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

您可以通过将其放宽到com.foo.myservice来修复它(当然,请记住扩大范围以扫描实体的任何其他效果)。

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

1

就我而言,在构建时SessionFactory,必须添加我的课程addAnnotationClass

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

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>

...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.