无法初始化JPA EntityManagerFactory: [PersistenceUnit: default] 无法构建Hibernate SessionFactory

16 浏览
0 Comments

无法初始化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 Set books = 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 Set authors = 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\n 4.0.0\n \n org.springframework.boot\n spring-boot-starter-parent\n 2.4.4\n \n \n com.example\n demo-spring\n 0.0.1-SNAPSHOT\n demo-spring\n Spring Boot演示项目\n \n 11\n \n \n \n org.springframework.boot\n spring-boot-starter-data-jpa\n \n \n org.springframework.boot\n spring-boot-starter-web\n \n \n com.h2database\n h2\n runtime\n \n \n org.springframework.boot\n spring-boot-starter-test\n test\n \n \n \n \n \n org.springframework.boot\n spring-boot-maven-plugin\n \n \n \n\n

0
0 Comments

这是一个关于"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了。

0