我想在 Glassfish 上使用 java EE 6 的简单 Web 应用程序中对 Oracle Express 数据库使用代理身份验证。Eclipselink 2.3.0 文档在这里说:
如果使用 JEE 和 JTA 托管的 EntityManager,则指定代理用户/密码可能会更加困难,因为 EntityManager 和 JDBC 连接不受应用程序控制。仍然可以在 EntityManager 上指定持久性单元属性。只要这是在 EntityManager 建立数据库连接之前完成的,它仍然可以工作。
我的代码如下,但我猜在@Postconstruct init()
调用该方法时已经建立了数据库连接,因为最后一个属性没有从默认的 true 更改为 false。另外,我从 save() 方法得到 ORA-00942: table or view does not exist。glassfish-resources.xml 中定义的 jdbc 连接池中的用户池没有访问表的权限,代理用户也是如此user_a
。
@Stateless
public class Boundary {
@PersistenceContext EntityManager em;
@PostConstruct
private void init() {
em.setProperty("eclipselink.oracle.proxy-type", OracleConnection.PROXYTYPE_USER_NAME);
em.setProperty(OracleConnection.PROXY_USER_NAME, "pool[user_a]");
em.setProperty(OracleConnection.PROXY_USER_PASSWORD, "pool");
em.setProperty(OracleConnection.PROXY_ROLES, "pool_user");
em.setProperty("eclipselink.jdbc.exclusive-connection.mode", "Always");
em.setProperty("eclipselink.jdbc.exclusive-connection.is-lazy", "false");
}
public void save() {
em.merge(new AnEntity());
}
}
我在这里没有太多经验,但是如果代理身份验证可以变得那么简单,那将非常有用,所以我花了一些时间尝试。在 JavaEE 托管上下文中,是否可以在EntityManager
连接之前设置属性?
我的persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="ProxyUserPU" transaction-type="JTA">
<jta-data-source>SecondTry</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="eclipselink.target-database" value="Oracle"/>
<property name="eclipselink.jdbc.exclusive-connection.is-lazy" value="true"/>
</properties>
</persistence-unit>
</persistence>