Hibernate 问题——“针对未映射类使用@OneTomany 或@ManyTomany”

我正在使用 Hibernate 注释寻找我的足迹,我遇到了一个问题,我希望有人能帮助解决。

我有两个实体,科和范围主题。该节有一个 List 类成员,因此是一对多关系。当我运行我的单元测试时,我得到了这个异常:

针对未映射类使用@OneTomany 或@ManyTomany: com.xxx.domain. Section.scopeTopic [ com.xxx.domain. ScopeTopic ]

我会假设这个错误意味着我的 ScopeTopic 实体没有映射到一个表?我看不见我做错了什么。下面是 Entity 类:


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

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

162808 次浏览

你的注释看起来不错。以下是需要检查的内容:

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

  • 如果您正在手动列出您的实体(在尾端. xml 中,在 hibernate.cfg.xml 中,或者在配置会话工厂时) ,那么请确保您也列出了 ScopeTopic实体

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

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

我的是没有 @Entity在许多方面的实体

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

大部分在 Hibernate中,需要在 hibernate.cfg.xml中添加类 Entity

<hibernate-configuration>
<session-factory>


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

我也遇到过同样的问题,我可以通过将实体添加到 restence.xml 中来解决这个问题。 问题是由于没有将实体添加到持久性配置中造成的。编辑您的持久性文件:

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

...

在我的例子中,a 必须添加我的类,当构建 SessionFactory时,使用 addAnnotationClass

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

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

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

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

检查@Entity 类的包结构。

我还面临着一个类似的问题,发生在我偶然拼错了软件包的名称。

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

如果您的@Entity 类没有被扫描,那么它将不会被映射,并且会显示上面提到的错误。

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

在这个例子中,我得到了同样的错误:

曾经是:

@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<>();

- 首先检查你把 @ 实体和顶部的所有型号

第二,使用正确的 table _ name 检查 @ Table (name = “ table _ name”)

- Third Check,在 Cfg.xmlConfiguration中添加 Entity 类

这个错误通常来自上述故障。

我添加了相同的问题,请确保两个实体类是在同一个包或其他下面。

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