我想使用Eclipse Link作为我的JPA引擎。我们正在使用java.sql.Connection的子类,我想知道我是否可以强制Eclipse Link使用我的连接。我想以编程方式设置连接对象。
类似于
MyConnection conn = new MyConnection(JDBC_URL, USR, PWD);
EntityManagerFactory factory = Persistence.createEntityManagerFactory(conn);
*此解决方案使用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
您可以使用以下代码以编程方式设置自定义连接:
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无法运行这些类
我使用的是没有Spring的MyBatis。我还必须使用另一个API提供的JDBC连接。 所以我创建了我的SqlSession,如下所示: 然后在我的代码中: 然而,我发现调用session.commit()什么也不做(即没有找到关于提交的日志),并且更改确实没有提交。似乎MyBatis的提交()由于某种原因被忽略了。 如果我不强制autocommit为false,更改将被提交(无需调用sessi
用户数据文件时在元数据服务中的一个特殊的键,它保存了一份能给虚拟机实例中的云服务使用的文件。比如,cloud-init程序便使用了用户数据文件,这个程序是一个源自Ubuntu的开源包,能用在多个Linux发行版上,它可以接管云实例的初始化过程。 您可以将用户数据写在一份本地文件中,然后在创建实例时用--user-data <user-data-file>参数将其传入。 $ nova boot --
我将为我的网站创建自定义用户提供程序,对于用户来说,没有“用户名”和“密码”这样的概念(实际上有类似于密码的东西,但它的名称不同)。在文档中,用户实体必须实现来自安全包的UserInterface,该安全包具有诸如getUsername、getPassword之类的方法。我能用我自己的领域吗?或者我应该使用名称冲突(例如,getUsername将返回我的唯一字段)来实现我的行为吗?