3

JPA エンジンとして EclipseLink を使用したいと考えています。java.sql.Connection のサブクラスを使用していますが、EclipseLink に接続を強制的に使用させることができるかどうかを知りたいです。プログラムで接続オブジェクトを設定したいと思います。

何かのようなもの

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

2 に答える 2

1

次のコードを使用して、カスタム接続をプログラムで設定できます。

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);

Googleで簡単に検索した後、この回答を見つけました:

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

それだけを使用して Eclipselink を強制的に接続する方法があるとは思いませんjava.sql.Connection。少なくともそのままではありません。上記の接続を渡す単純なユーティリティ メソッドを作成し、上で説明したようにプロパティ マップを作成することができます。

public Map convertConnectionToProperties(Connection conn) {
    // Do the mapping

    return theMap;
}

このリンクを見れば分かると思いますが、

Persistence.java

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());
于 2014-06-27T13:13:28.547 に答える
0

※本ソリューションはSpring Frameworkを使用しています。

javax.sql.DataSource

まず、接続を でラップする必要がありますjavax.sql.DataSource。例:

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 で既存のクラスを拡張できます。

javax.persistence.EntityManagerFactory

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>
    

    または、必要に応じて、必要な jar:

    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
    
于 2014-06-27T14:25:02.420 に答える