如何配置Jakarta EE容器管理实体管理器与内存数据库

来源:站长素材作者:湖南程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《如何配置Jakarta EE容器管理实体管理器与内存数据库》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何配置Jakarta EE容器管理实体管理器与内存数据库》有用,将其分享出去将是对创作者最好的鼓励。

Jakarta EE中的JPA容器管理实体管理器由应用服务器负责生命周期管理,开发者无需手动创建和关闭实体管理器实例,只需要通过注解注入即可使用,大幅降低了持久层代码的复杂度。内存数据库将数据存储在内存中,读写速度极快,非常适合开发调试和单元测试场景,不需要额外安装独立的数据库服务。

如何配置Jakarta EE容器管理实体管理器与内存数据库

容器管理实体管理器基础

容器管理实体管理器的核心特点是其生命周期由Jakarta EE容器管控,事务默认与容器的事务管理集成,支持声明式事务配置。开发者通常通过@PersistenceContext注解注入实体管理器实例,容器会自动为其分配对应的持久化上下文。

与应用程序管理实体管理器不同,容器管理实体管理器不支持手动调用close方法,也不建议在非事务场景下使用,否则可能出现持久化上下文不一致的问题。

注入实体管理器示例

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Named;

@Named
@RequestScoped
public class UserBean {
    // 注入容器管理的实体管理器
    @PersistenceContext(unitName = "testPU")
    private EntityManager entityManager;

    public void saveUser() {
        User user = new User();
        user.setName("测试用户");
        user.setAge(20);
        // 持久化实体
        entityManager.persist(user);
    }
}

常用内存数据库选择

常用的内存数据库包括H2、HSQLDB、Derby等,其中H2数据库体积小、功能完善,对JPA的支持较好,是Jakarta EE开发中常用的内存数据库选项。这些数据库都支持内存模式运行,服务停止后数据会自动清空,不会残留测试数据。

完整配置步骤

1. 添加依赖

如果是Maven项目,需要在pom.xml中添加JPA API、H2数据库以及Jakarta EE容器相关依赖,以下是核心依赖示例:

<dependencies>
    <!-- Jakarta EE JPA API -->
    <dependency>
        <groupId>jakarta.persistence</groupId>
        <artifactId>jakarta.persistence-api</artifactId>
        <version>3.1.0</version>
    </dependency>
    <!-- H2内存数据库 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>2.2.224</version>
        <scope>runtime</scope>
    </dependency>
    <!-- Jakarta EE容器依赖,以WildFly为例 -->
    <dependency>
        <groupId>org.wildfly.bom</groupId>
        <artifactId>wildfly-jakartaee10-with-tools</artifactId>
        <version>30.0.1.Final</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
</dependencies>

2. 配置持久化单元

src/main/resources/META-INF目录下创建persistence.xml文件,配置持久化单元,指定使用H2内存数据库,以及容器管理实体管理器的相关属性:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="3.0"
             xmlns="https://jakarta.ee/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd">
    <persistence-unit name="testPU" transaction-type="JTA">
        <!-- 配置JPA实现,这里使用Hibernate -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!-- 配置实体类所在包 -->
        <class>com.example.entity.User</class>
        <!-- 使用容器管理的事务,不需要配置数据源,由容器提供 -->
        <properties>
            <!-- 配置H2内存数据库JDBC连接 -->
            <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"/>
            <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="jakarta.persistence.jdbc.user" value="sa"/>
            <property name="jakarta.persistence.jdbc.password" value=""/>
            <!-- 自动建表 -->
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <!-- 显示SQL语句 -->
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

3. 配置容器数据源(可选)

如果使用独立的应用服务器,也可以先在服务器中配置H2数据源,再在persistence.xml中引用数据源名称,以WildFly为例,通过命令行添加数据源:

# 添加H2驱动模块
module add --name=com.h2database --resources=h2-2.2.224.jar --dependencies=jakarta.transaction.api
# 添加数据源
data-source add --name=H2DS --jndi-name=java:jboss/datasources/H2DS --driver-name=h2 --connection-url=jdbc:h2:mem:testdb --user-name=sa --password=

对应的persistence.xml中持久化单元配置修改为:

<persistence-unit name="testPU" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>java:jboss/datasources/H2DS</jta-data-source>
    <class>com.example.entity.User</class>
    <properties>
        <property name="hibernate.hbm2ddl.auto" value="update"/>
        <property name="hibernate.show_sql" value="true"/>
    </properties>
</persistence-unit>

实体类示例

创建对应的实体类,使用JPA注解标注映射关系:

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Integer age;

    // getter和setter方法
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

常见问题排查

  • 如果注入实体管理器时出现空指针异常,检查@PersistenceContextunitName是否与persistence.xml中的持久化单元名称一致,同时确认类是否被容器管理,比如是否添加了@Named@Stateless等注解。
  • 如果数据库连接失败,检查JDBC连接字符串是否正确,内存数据库的连接字符串格式是否符合对应数据库的规范,H2内存模式需要添加DB_CLOSE_DELAY=-1避免连接关闭后数据库被清空。
  • 如果实体无法持久化,检查是否开启了事务,容器管理实体管理器默认需要事务支持,确保在方法或者类上添加了@Transactional注解。

Jakarta_EEJPA容器管理实体管理器内存数据库修改时间:2026-07-19 17:18:45

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。