我找到了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;
}
}
我很确定这是我自己缺乏理解的错误所以一些指导会很棒,谢谢!
答案 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 就会在适用的数据库中自动生成一个表。