Spring Boot 3.0.0无法导入javax.persistence的@Entity注解问题求助
问题背景
使用Spring Initializr生成Spring Boot 3.0.0项目,配置Java 19、Maven,包含Mariadb驱动、Spring Web、Spring Data JPA依赖。创建Student实体时,无法从javax.persistence导入@Entity等注解,仅能找到jakarta.persistence包;手动添加javax.persistence依赖后,注解可正常导入,但数据库表始终未自动创建。
相关代码文件
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.0.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>19</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <scope>runtime</scope> </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>
Student.java
package com.example.demo; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Column; // 补充缺失的导入语句 @Entity(name = "student") public class Student { @Id @Column(name="id") private int id; @Column(name="name") private String name; // JPA规范要求的无参构造器,显式定义避免潜在问题 public Student() {} // 添加getter/setter,方便后续操作实体 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
application.properties
spring.datasource.url=jdbc:mariadb://localhost:3307/db1 spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=org.mariadb.jdbc.Driver spring.jpa.hibernate.ddl-auto=create-drop # 开启SQL日志,查看Hibernate执行的DDL语句 spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true
DemoApplication.java
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
问题分析与解决方案
1. javax.persistence vs jakarta.persistence 包的问题
Spring Boot 3.0基于Jakarta EE 9,官方已将所有Java EE相关API从javax.*迁移到jakarta.*包,这是版本升级的重大变更。你观看的教程使用的是Spring Boot 2.x版本,因此仍使用javax.persistence。
- 无需手动添加
javax.persistence依赖,这会导致API冲突,直接使用jakarta.persistence下的注解即可。
2. 数据库表未创建的解决步骤
(1)修复实体类的注解导入
你的Student类中使用了@Column注解但未导入jakarta.persistence.Column,这会导致编译错误,Hibernate无法识别实体类,自然不会生成表。需补充对应的导入语句。
(2)确保JPA能扫描到实体类
@SpringBootApplication默认会扫描当前包(com.example.demo)及其子包下的实体类,你的Student类在同一包下,此步骤无需额外配置。若实体类在其他包,需添加@EntityScan("你的实体包路径")到入口类。
(3)验证数据库连接配置
- 确认Mariadb服务运行在端口3307,且数据库
db1已手动创建(create-drop仅负责创建表,不会自动创建数据库)。 - 检查用户名和密码是否正确,确保数据库用户有创建表的权限。
(4)查看Hibernate日志
添加spring.jpa.show-sql=true和spring.jpa.properties.hibernate.format_sql=true到配置文件,启动项目后查看控制台输出:
- 若能看到Hibernate生成的
CREATE TABLE student (...)语句,说明实体类识别正常,检查表是否因权限或数据库连接问题未创建。 - 若没有DDL语句输出,说明实体类未被扫描到,需检查包路径或
@EntityScan配置。
(5)添加JPA要求的无参构造器
JPA规范要求实体类必须有无参构造器,虽然Java会默认生成,但显式添加能避免潜在的序列化或反射问题。
内容的提问来源于stack exchange,提问作者varo111

