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实体PostComment,我面临的问题是在添加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 一起正常工作

Spring Boot框架的搭建

关于 Spring Boot 自动装配你知道多少?

Spring Boot 持续更新中...

由于未绑定的 RestTemplate,Spring-Boot RestClientTest 无法正确自动配置 MockRestServiceServer

Spring Boot + Spring Security解决UsernameNotFoundException无法被捕获的问题