我正在使用 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;
}
}
我很确定这是我自己缺乏理解的错,所以一些指导会很棒,谢谢!
您的注释看起来不错。以下是要检查的事项:
确保注解是 javax.persistence.Entity,而不是 org.hibernate.annotations.Entity。前者使实体可检测。后者只是一个补充。
如果您手动列出实体(在 persistence.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>
如果您在 spring-data-jpa 项目中使用 Java 配置,请确保您正在扫描实体所在的包。例如,如果实体存在 com.foo.myservice.things 那么下面的配置注释将不会捡起来。
您可以通过将其放松为 com.foo.myservice 来修复它(当然,请记住扩大范围以扫描实体的任何其他影响)。
@Configuration
@EnableJpaAuditing
@EnableJpaRepositories("com.foo.myservice.repositories")
public class RepositoryConfiguration {
}
在我的情况下,在构建 SessionFactory
时,必须使用 addAnnotationClass
添加我的类
Configuration configuration.configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration
.addAnnotatedClass(MyEntity1.class)
.addAnnotatedClass(MyEntity2.class)
.buildSessionFactory(builder.build());
我有同样的问题,我可以通过将实体添加到 persistence.xml 来解决它。该问题是由于实体未添加到持久性配置中而引起的。编辑您的持久性文件:
<persistence-unit name="MY_PU" transaction-type="RESOURCE_LOCAL">
<provider>`enter code here`
org.hibernate.jpa.HibernatePersistenceProvider
</provider>
<class>mypackage.MyEntity</class>
...
-首先检查你把@Entity和所有模型的顶部
-Second 检查@Table(name="table_name") 与正确的table_name
-第三次检查您在 hibernate.cfg.xml 或 persistence.configuration 中添加实体类
此错误通常来自上述故障。
检查 @Entity 类的包结构。
我也遇到了类似的问题,因为我不小心拼错了包名。
确保所有 @Entity 类都位于具有 main() 函数的 Class 的包内或下的包(文件夹)下,因为 SpringBootApplication 只会扫描同一个包的内部和内部。
如果您的 @Entity 类没有被扫描,它将不会被映射,并且会给出上述错误。
您还可以通过检查数据库来检查您的 @Entity 类是否被正确映射或扫描。每当一个类被标记为@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<>();
我添加了同样的问题,请确保两个实体类在同一个包中或下面的另一个。
例如,当我们试图映射两个实体类 User 和 Posts 类时。用户类必须是 com.microservices.user,第二类应该是 com.microservices.user.posts
不定期副业成功案例分享
packagesToScan
扫描包裹