You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Servlet项目中如何为getEntityManager方法定义PersistenceProvider?

解决JPA无持久化提供者异常(不引入Hibernate等外部库)

我在Java/Servlet项目中为Model类实现通用DAO模板,包含建表、插入、更新、删除和查询方法。所有方法都基于protected EntityManager getEntityManager()方法,我在该方法中配置了SQLite数据库路径及相关参数,但执行时抛出错误:

javax.persistence.PersistenceException: No Persistence provider for EntityManager named default

当前DAO类实现代码如下:

public abstract class Dao<E extends Model> {
    private Class<E> classe;

    public Dao(Class<E> classe) {
        this.classe = classe;
        if(!exists()) create();
    }

    protected EntityManager getEntityManager() {
        String url = getClass().getResource("/data.db").toString();
        Map<String, String> properties = new HashMap<>();
        properties.put("javax.persistence.jdbc.provider", "org.eclipse.persistence.jpa.PersistenceProvider");
        properties.put("javax.persistence.jdbc.driver", "org.sqlite.JDBC");
        properties.put("javax.persistence.jdbc.url", "jdbc:sqlite:"+url);
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("default", properties);
        return entityManagerFactory.createEntityManager();
    }

    // 其他增删改查方法...
}

解决方案(不引入Hibernate)

因为你指定了EclipseLink作为JPA提供者,只需针对EclipseLink做以下调整:

  1. 添加EclipseLink依赖
    JPA只是规范,需要具体实现库支持。EclipseLink是JPA的官方参考实现,无需引入Hibernate。
  • 若使用Maven,在pom.xml中添加依赖:
    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>eclipselink</artifactId>
        <version>2.7.10</version> <!-- 可替换为最新稳定版 -->
    </dependency>
    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>org.eclipse.persistence.jpa</artifactId>
        <version>2.7.10</version>
    </dependency>
    
  • 若为非Maven项目,手动下载EclipseLink的jar包(包含eclipselink.jar和org.eclipse.persistence.jpa.jar),放入项目的WEB-INF/lib目录。
  • 确保SQLite JDBC驱动(如sqlite-jdbc-*.jar)已在项目中。
  1. 修正EntityManagerFactory创建逻辑
    原代码通过Persistence.createEntityManagerFactory动态传参时,可能无法正确识别提供者。直接实例化EclipseLink的提供者类,并修正SQLite路径问题:
protected EntityManager getEntityManager() {
    // 修正SQLite路径:去掉getResource返回的file前缀
    String resourceUrl = getClass().getResource("/data.db").toString();
    String jdbcUrl = "jdbc:sqlite:" + resourceUrl.replace("file:", "");

    Map<String, String> properties = new HashMap<>();
    // 明确指定EclipseLink提供者
    properties.put("javax.persistence.provider", "org.eclipse.persistence.jpa.PersistenceProvider");
    properties.put("javax.persistence.jdbc.driver", "org.sqlite.JDBC");
    properties.put("javax.persistence.jdbc.url", jdbcUrl);
    // 可选:配置自动建表(根据需求调整DDL策略)
    properties.put("eclipselink.ddl-generation", "create-or-extend-tables");
    properties.put("eclipselink.ddl-generation.output-mode", "database");

    // 直接通过EclipseLink提供者创建工厂
    PersistenceProvider provider = new org.eclipse.persistence.jpa.PersistenceProvider();
    EntityManagerFactory emf = provider.createEntityManagerFactory("default", properties);
    return emf.createEntityManager();
}
  1. 确认实体类的JPA注解正确性
    所有继承Model的实体类必须添加JPA核心注解:
  • 类上添加@Entity标识为JPA实体
  • 主键字段添加@Id,并根据需求配置@GeneratedValue(SQLite支持自增主键)
  • 其他字段按需添加@Column等注解

内容的提问来源于stack exchange,提问作者Kleber Mota

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:06:09