Spring Boot 自动配置无法与 spring-data-jpa 一起正常工作
Posted
技术标签:
【中文标题】Spring Boot 自动配置无法与 spring-data-jpa 一起正常工作【英文标题】:Spring boot autoconfiguration not working properly with spring-data-jpa 【发布时间】: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 相关。我将更新问题以提供更多详细信息。 【参考方案1】:@GeneratedValue(strategy = GenerationType.AUTO)
@GeneratedValue(strategy = GenerationType.IDENTITY)
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@GeneratedValue(strategy = GenerationType.TABLE)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "book_generator")
@TableGenerator(name="book_generator", table="id_generator", schema="bookstore")
尝试将您的生成策略更改为上述任何类型。看起来您还没有为框架指定任何方法来识别生成策略。
详细解释请参考以下链接 https://thoughts-on-java.org/jpa-generate-primary-keys/
【讨论】:
改变生成策略是什么意思?只选择上述之一或选择与GenerationType.AUTO
不同的东西?因为如果您不指定任何内容,则 AUTO 是默认策略。以上是关于Spring Boot 自动配置无法与 spring-data-jpa 一起正常工作的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 自动配置无法与 spring-data-jpa 一起正常工作
由于未绑定的 RestTemplate,Spring-Boot RestClientTest 无法正确自动配置 MockRestServiceServer
Spring Boot + Spring Security解决UsernameNotFoundException无法被捕获的问题