【发布时间】:2019-08-04 22:52:57
【问题描述】:
我有一个小型 Spring Boot 应用程序(它只是一个概念证明),它针对 H2 内存数据库运行并使用 spring-data-jpa 来处理持久性。它包含一个允许处理帖子和 cmets 的 REST API,因此您可以在这些帖子上创建和检索帖子和 cmets。
该应用程序有两个JPA实体Post和Comment,我面临的问题是在添加Comment实体后,应用程序无法启动,但在添加Comment之前我刚刚拥有@987654325 @entity 应用程序启动并通过测试。似乎 Spring Boot 无法正确自动配置 JPA。
这是我得到的错误:
[ERROR] shouldReturnNullForNotExistingPost(com.devskiller.tasks.blog.service.PostServiceTest) 已用时间:0.001 s
java.lang.IllegalStateException: 无法加载 ApplicationContext
原因:org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class] 中定义名称为“entityManagerFactory”的 bean 创建错误:调用 init方法失败;嵌套异常是 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory;嵌套异常是 org.hibernate.MappingException:无法确定类型:com.devskiller.tasks.blog.model.Post,在表:评论,对于列:[org.hibernate.mapping.Column(post)]
原因:javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory;嵌套异常是 org.hibernate.MappingException:无法确定类型:com.devskiller.tasks.blog.model.Post,在表:评论,对于列:[org.hibernate.mapping.Column(post)]
原因:org.hibernate.MappingException:无法确定类型:com.devskiller.tasks.blog.model.Post,在表:评论,列:[org.hibernate.mapping.Column(post)]
Post实体:
@Entity
public class Post {
@Id
@GeneratedValue
private Long id;
private String title;
@Column(length = 4096)
private String content;
private LocalDateTime creationDate;
// Getters and setters
Comment实体:
@Entity
public class Comment {
@Id
@GeneratedValue
private Long id;
private String author;
private String content;
private Post post;
// Getters and setters
解决方案:
将@OneToOne 注释添加到Comment.post 字段后,错误消失。但为什么?我认为根据 JPA 规范,没有必要添加此注释以使用默认配置创建两个实体之间的单向关系。不是吗?
【问题讨论】:
-
在我看来,生成ID没有问题,你能分享你的完整错误堆栈
-
@PatelRomil 您实际上是对的,经过一番挖掘之后,似乎错误必须与 spring boot 自动配置和 jpa 相关。我将更新问题以提供更多详细信息。
标签: java spring hibernate spring-boot spring-data-jpa