ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在使用 Hibernate Annotations 找到自己的脚,我遇到了一个问题,希望有人能提供帮助。

我有 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;
    }
}

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


B
Bozho

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

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

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

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


啊,谢谢!第 2 点是关键,我在创建 SessionFactory 时忘记将 ScopeTopic 放在我的 annotatedClasses 属性列表中,n00b 错误!
对于那些刚刚发表此评论的人。 org.hibernate.annotations.Entity 在 Hibernate 4 中已弃用。第 1 点不再适用。
对我来说这是第 2 点,因为我一直在编辑我的构建文件夹中的 hibernate.cfg.xml。
在 Spring Boot 中,我在这里遇到了一个问题,第 2 点帮助我解决了这个问题。我一直让 Spring Boot 自动配置我的会话工厂,并且在一个分支中我添加了一个新实体......然后在合并之前,我有另一个分支,我必须自定义会话工厂。两个分支同时合并,我得到了这个问题中列出的错误。我的新实体不再被 Spring Boot 自动扫描,因为我已经配置了 sessionfactory 并且不认为包含来自其他分支的新实体。
就我而言,我忘记使用 packagesToScan 扫描包裹
Y
Youans

我的多方实体上没有 @Entity

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

c
c.sankhala

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


S
Sai prateek

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

<hibernate-configuration>
  <session-factory>

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

M
Michael Peterson

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

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

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

V
VLazzarova

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

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

D
Daniel Rodríguez

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

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

...


S
Sajjad Serajzadeh

-首先检查你把@Entity和所有模型的顶部

-Second 检查@Table(name="table_name") 与正确的table_name

-第三次检查您在 hibernate.cfg.xml 或 persistence.configuration 中添加实体类

此错误通常来自上述故障。


P
Priyansh Jain

检查 @Entity 类的包结构。

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

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

如果您的 @Entity 类没有被扫描,它将不会被映射,并且会给出上述错误。

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


A
ACV

在这种情况下,我遇到了同样的错误:

曾是:

@ElementCollection(targetClass=**String**.class)
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "user_roles",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> authorities = new HashSet<>();

固定为:

@ElementCollection(targetClass=**Role**.class)
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "user_roles",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> authorities = new HashSet<>();

a
anil reddy

我添加了同样的问题,请确保两个实体类在同一个包中或下面的另一个。

例如,当我们试图映射两个实体类 User 和 Posts 类时。用户类必须是 com.microservices.user,第二类应该是 com.microservices.user.posts


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅