我有一个很小的spring boot应用程序(仅是概念证明),它针对H2内存数据库运行,并使用spring-data-jpa处理持久性。它由一个REST API组成,该API允许处理帖子和评论,因此您可以创建和检索帖子和评论。
该应用程序具有两个JPA实体Post
和Comment
,而我面临的问题是,在添加Comment
实体之后,该应用程序无法启动,但是在添加{{1}之前}当我只有Comment
实体时,应用程序启动并通过了测试。看来Spring Boot无法正确地自动配置JPA。
这是我得到的错误:
[错误] 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时出错。方法失败;嵌套的异常是javax.persistence.PersistenceException:[PersistenceUnit:默认]无法构建Hibernate SessionFactory。嵌套的异常是org.hibernate.MappingException:无法确定com.devskiller.tasks.blog.model.Post的类型,在表中:注释,对于列:[org.hibernate.mapping.Column(post)]
由以下原因引起:javax.persistence.PersistenceException:[PersistenceUnit:默认]无法构建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
实体:
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
字段后,错误消失。但为什么?我认为,根据JPA规范,没有必要添加此批注以在默认配置下在两个实体之间创建单向关系。不是吗?
答案 0 :(得分:0)
@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/