无法初始化JPA EntityManagerFactory: [PersistenceUnit: default] 无法构建Hibernate SessionFactory
无法初始化JPA EntityManagerFactory: [PersistenceUnit: default] 无法构建Hibernate SessionFactory
根据这个项目(更新到当前最新的spring boot + java 11版本):https://github.com/springframeworkguru/spring5webapp/tree/bootstrap-v2,我尝试从IntelliJ运行应用程序,但是遇到了以下错误:\n
2021-04-02 11:18:08.185 INFO 86413 --- [ main] org.hibernate.dialect.Dialect : HHH000400: 使用方言: org.hibernate.dialect.H2Dialect 2021-04-02 11:18:08.422 ERROR 86413 --- [ main] j.LocalContainerEntityManagerFactoryBean : 初始化JPA EntityManagerFactory失败:[PersistenceUnit: default] 无法构建Hibernate SessionFactory;嵌套异常是org.hibernate.MappingException: 无法确定类型:java.util.Set,位于表:book,列:[org.hibernate.mapping.Column(authors)] 2021-04-02 11:18:08.423 WARN 86413 --- [ main] ConfigServletWebServerApplicationContext : 在初始化上下文过程中遇到异常 - 取消刷新尝试:org.springframework.beans.factory.BeanCreationException: 在类路径资源[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]中定义的bean 'entityManagerFactory'创建失败:初始化方法调用失败;嵌套异常是javax.persistence.PersistenceException: [PersistenceUnit: default] 无法构建Hibernate SessionFactory;嵌套异常是org.hibernate.MappingException: 无法确定类型:java.util.Set,位于表:book,列:[org.hibernate.mapping.Column(authors)] 2021-04-02 11:18:08.423 INFO 86413 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 启动关闭流程...
\n其中这部分看起来是关键:\n
无法确定类型:java.util.Set,位于表:book,列:[org.hibernate.mapping.Column(authors)]
\n有什么建议吗?\n还有:\nAuthor.java\n
package com.example.demospring.domain; import javax.persistence.*; import java.util.HashSet; import java.util.Set; @Entity public class Author { private String firstName; private String lastName; @ManyToMany(mappedBy = "authors") private Setbooks = new HashSet<>(); @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; public Author() { } public Author(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public Set getBooks() { return books; } public void setBooks(Set books) { this.books = books; } public void setId(Long id) { this.id = id; } @Id public Long getId() { return id; } @Override public String toString() { return "Author{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", books=" + books + ", id=" + id + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Author author = (Author) o; return id != null ? id.equals(author.id) : author.id == null; } @Override public int hashCode() { return id != null ? id.hashCode() : 0; } }
\nBook.java\n
package com.example.demospring.domain; import javax.persistence.*; import java.util.HashSet; import java.util.Set; @Entity public class Book { private String title; private String isbn; @ManyToMany @JoinTable(name = "author_book", joinColumns = @JoinColumn(name="book_id"), inverseJoinColumns = @JoinColumn(name="author_id")) private Setauthors = new HashSet<>(); @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; public Book() { } public Book(String title, String isbn) { this.title = title; this.isbn = isbn; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public Set getAuthors() { return authors; } public void setAuthors(Set authors) { this.authors = authors; } public void setId(Long id) { this.id = id; } @Id public Long getId() { return id; } @Override public String toString() { return "Book{" + "title='" + title + '\'' + ", isbn='" + isbn + '\'' + ", authors=" + authors + ", id=" + id + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Book book = (Book) o; return id != null ? id.equals(book.id) : book.id == null; } @Override public int hashCode() { return id != null ? id.hashCode() : 0; } }
\npom.xml\n\n
这是一个关于"Failed to initialize JPA EntityManagerFactory: [PersistenceUnit: default] Unable to build Hibernate SessionFactory"问题的解决方法。
问题的原因是在实体类中存在错误的注解导致Hibernate无法构建SessionFactory。解决方法是从实体类的getId()方法中移除注解。
具体来说,这个问题是一个重复的问题,链接为"https://stackoverflow.com/questions/3774198"。在这个链接中,用户遇到了一个类似的问题,即org.hibernate.MappingException: Could not determine type for: java.util.List, at table: College, for columns: [org.hibernate.mapping.Column(students)]。
解决方法是在Author和Book这两个实体类中的getId()方法中移除注解。这个注解可能被错误地添加到了getId()方法上,导致了Hibernate无法正确地解析实体类。
这个问题的解决方法很简单,只需要在实体类中移除错误的注解即可。这样就能够成功初始化JPA EntityManagerFactory并构建Hibernate SessionFactory了。