当前位置: 首页 > 知识库问答 >
问题:

EclipseLink JPA 2.1用户提供的连接

司徒嘉祥
2023-03-14

我想使用Eclipse Link作为我的JPA引擎。我们正在使用java.sql.Connection的子类,我想知道我是否可以强制Eclipse Link使用我的连接。我想以编程方式设置连接对象。

类似于

MyConnection conn = new MyConnection(JDBC_URL, USR, PWD);
EntityManagerFactory factory = Persistence.createEntityManagerFactory(conn);

共有2个答案

楚嘉玉
2023-03-14

*此解决方案使用Spring框架。

首先,您需要将连接封装在javax中。sql。数据源,例如:

import java.sql.Connection;
import java.sql.SQLException;

import org.springframework.jdbc.datasource.AbstractDataSource;

public class MyDataSource extends AbstractDataSource {

    private static final String JDBC_URL = "jdbc:mysql://localhost/test";
    private static final String USR = "root";
    private static final String PWD = "";

    public Connection getConnection() throws SQLException {
        return new MyConnection(JDBC_URL, USR, PWD);
    }

    public Connection getConnection(String username, String password)
            throws SQLException {
        return new MyConnection(JDBC_URL, USR, PWD);
    }
}

为了避免覆盖所有方法,可以在Spring中扩展现有类。

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter;

public class Main {

    public static void main(String[] args) {
        LocalContainerEntityManagerFactoryBean bean =
                new LocalContainerEntityManagerFactoryBean();
        bean.setDataSource(new MyDataSource());
        bean.setPersistenceUnitName("TestPU");
        bean.setJpaVendorAdapter(new EclipseLinkJpaVendorAdapter());
        bean.afterPropertiesSet();

        EntityManagerFactory factory = bean.getNativeEntityManagerFactory();
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();
        User user = new User();
        user.setFullname("Mister");
        em.persist(user);
        em.getTransaction().commit();
        em.close();
    }

}

注意事项

>

  • 您可能需要在persistence.xml中添加下一个属性:

    <property name="eclipselink.weaving" value="false"/>
    

    我使用了一个独立的Maven项目来测试pom中的代码和依赖项。xml如下所示:

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.31</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.5.1</version>
        </dependency>
    </dependencies>
    

    或者,如果您愿意,所需的罐子:

    mysql-connector-java-5.1.31.jar
    spring-context-4.0.5.RELEASE.jar
    spring-aop-4.0.5.RELEASE.jar
    aopalliance-1.0.jar
    spring-beans-4.0.5.RELEASE.jar
    spring-core-4.0.5.RELEASE.jar
    commons-logging-1.1.3.jar
    spring-expression-4.0.5.RELEASE.jar
    spring-orm-4.0.5.RELEASE.jar
    spring-jdbc-4.0.5.RELEASE.jar
    spring-tx-4.0.5.RELEASE.jar
    eclipselink-2.5.1.jar
    javax.persistence-2.1.0.jar
    commonj.sdo-2.1.1.jar
    

  • 晋承运
    2023-03-14

    您可以使用以下代码以编程方式设置自定义连接:

    Map properties = new HashMap();
    
    // Configure the internal EclipseLink connection pool
    properties.put(JDBC_DRIVER, "oracle.jdbc.OracleDriver");
    properties.put(JDBC_URL, "jdbc:oracle:thin:@localhost:1521:ORCL");
    properties.put(JDBC_USER, "user-name");
    properties.put(JDBC_PASSWORD, "password");
    Persistence.createEntityManagerFactory("unit-name", properties);
    

    经过快速的谷歌搜索,我在这里找到了这个答案:

    http://eclipse.1072660.n5.nabble.com/Defining-persistence-xml-programatically-td2536.html

    我不相信有一种方法可以迫使Eclipselink只使用java进行连接。sql。连接;至少不是现成的。您可以创建一个简单的实用方法来传递所述连接,并按照上面所述构建属性映射。

    public Map convertConnectionToProperties(Connection conn) {
        // Do the mapping
    
        return theMap;
    }
    

    如果你看看这个链接,你会看到

    createEntityManagerFactory(String persistenceUnitName) 
    createEntityManagerFactory(String persistenceUnitName, Map properties) 
    

    这就是它可以作为参数的全部内容。简而言之;如果不使用连接对象并将其调整为返回符合创建实体管理工厂(createEntityManagerFactory)可以接受的内容,那么您所要求的是不可能的。

    class MyConnection {
         // Your code here
        
        public Map convertToMap() {
            // Do the mapping
    
            return theMap;
        }
    
        public String getPersistenceUnitName() {
            return "Some-Name";
        }
    }
    

    然后像这样利用它:

    MyConnection conn = new MyConnection(JDBC_URL, USR, PWD);
    EntityManagerFactory factory = Persistence.createEntityManagerFactory(conn.getPersistenceUnitName(), conn.convertToMap());
    
     类似资料:
    • 我正在阅读Symfony通过自定义用户提供商管理用户的方法:https://symfony.com/doc/current/security/custom_provider.html 当用户提交用户名和密码时,身份验证层要求配置的用户提供程序返回给定用户名的用户对象。Symfony然后检查此用户的密码是否正确,并生成安全令牌 当我们在本地使用用户/密码连接到数据库时,这非常有效,但是我想对另一个服

    • 在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直连方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获取列表。 通过 XML 配置 如果是线上需求需要点对点,可在 <dubbo:reference> 中配置 url 指向提供者,将绕过注册中心,多个地址用分号隔开,配置如下 1: <dubbo:refe

    • 我正试图在Apache ignite Sink连接器的帮助下将kafka主题数据加载到ignite缓存中。面临以下问题。所有必需的JAR以及ignite配置(xml)文件都已就绪。 我很不确定为什么它要为IGniteSinkTask$StreamerContext$Holder抛出ConnectException和NoClassDefoundException。由于某些原因,java无法运行这些类

    • 用户数据文件时在元数据服务中的一个特殊的键,它保存了一份能给虚拟机实例中的云服务使用的文件。比如,cloud-init程序便使用了用户数据文件,这个程序是一个源自Ubuntu的开源包,能用在多个Linux发行版上,它可以接管云实例的初始化过程。 您可以将用户数据写在一份本地文件中,然后在创建实例时用--user-data <user-data-file>参数将其传入。 $ nova boot --

    • 我使用的是没有Spring的MyBatis。我还必须使用另一个API提供的JDBC连接。 所以我创建了我的SqlSession,如下所示: 然后在我的代码中: 然而,我发现调用session.commit()什么也不做(即没有找到关于提交的日志),并且更改确实没有提交。似乎MyBatis的提交()由于某种原因被忽略了。 如果我不强制autocommit为false,更改将被提交(无需调用sessi

    • 我将为我的网站创建自定义用户提供程序,对于用户来说,没有“用户名”和“密码”这样的概念(实际上有类似于密码的东西,但它的名称不同)。在文档中,用户实体必须实现来自安全包的UserInterface,该安全包具有诸如getUsername、getPassword之类的方法。我能用我自己的领域吗?或者我应该使用名称冲突(例如,getUsername将返回我的唯一字段)来实现我的行为吗?