Spring Boot启动报错:entityManagerFactory创建失败,关联属性类型错误
Spring Boot JPA 启动错误及数据库自动创建问题
启动错误信息
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Property 'com.example.shopping.models.Account.orders' is not a collection and may not be a '@OneToMany', '@ManyToMany', or '@ElementCollection'
相关代码
Account 实体类
package com.example.shopping.models; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; @Entity public class Account { @Id @GeneratedValue(strategy= GenerationType.SEQUENCE, generator="account_id") private Long id; public String name; public String email; @OneToMany() public Iterable<Order> orders; }
Order 实体类
package com.example.shopping.models; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; @Entity public class Order { @Id @GeneratedValue(strategy= GenerationType.SEQUENCE, generator="order_id") private Long id; @Id public Long accountId; @ManyToOne public Account account; @OneToMany() public Iterable<ProductOrder> products; }
application.properties 配置
## default connection pool spring.datasource.hikari.connectionTimeout=20000 spring.datasource.hikari.maximumPoolSize=5 ## PostgreSQL spring.datasource.url=jdbc:postgresql://localhost:5432/shopping?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&autoReconnect=true spring.datasource.username=postgres spring.datasource.password=test # create and drop table, good for testing, production set to none or comment it spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.generate-ddl=true app.db.init.enabled=true spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
pom.xml 依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>shopping</artifactId> <version>0.0.1-SNAPSHOT</version> <name>shopping</name> <description>Shopping project for Spring Boot</description> <properties> <java.version>21</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
问题解决
1. 修复 @OneToMany 字段类型错误
错误核心是 @OneToMany 注解只能用于具体集合类型(如 List、Set),不能用 Iterable 接口。同时需要修正实体类中的主键关联问题:
修改后的 Account 类
@Entity public class Account { // 其他字段保持不变 @OneToMany(mappedBy = "account") // 指定关联由 Order 中的 account 字段维护 public List<Order> orders = new ArrayList<>(); // 改为 List 并初始化 }
修改后的 Order 类
@Entity public class Order { @Id @GeneratedValue(strategy= GenerationType.SEQUENCE, generator="order_id") private Long id; // 移除重复的 @Id 注解,一个实体只能有一个主键 public Long accountId; @ManyToOne @JoinColumn(name = "account_id") // 显式指定外键列名,关联 Account 的 id public Account account; @OneToMany() public List<ProductOrder> products = new ArrayList<>(); // 改为 List 并初始化 }
2. 数据库自动创建说明
- 数据库创建:PostgreSQL 的 JDBC 驱动不支持
createDatabaseIfNotExist=true参数(该参数是 MySQL 驱动专属),所以需要你手动在 PostgreSQL 中创建shopping数据库。 - 表创建:配置中
spring.jpa.hibernate.ddl-auto=create-drop会让 Hibernate 在启动时自动生成表结构,应用关闭时删除表,适合测试场景。只要数据库已存在,表会自动创建。
内容的提问来源于stack exchange,提问作者Andrea D'Attero
相关产品推荐
相关产品推荐

