В Java EE 6: когда я мог изменить свойства EntityManager?

Я хочу использовать прокси-аутентификацию для базы данных Oracle Express в простом веб-приложении с Java EE 6 на Glassfish. Eclipselink 2.3.0 здесь написано:

Если используется управляемый JEE и JTA EntityManager, указание прокси-пользователя / пароля может быть более сложным, поскольку соединение EntityManager и JDBC не находится под контролем приложений. Свойства единицы сохраняемости все еще могут быть указаны в EntityManager. Пока это будет сделано до того, как EntityManager установит соединение с базой данных, это все равно будет работать.

Мой код, как показано ниже, но я предполагаю, что соединение с базой данных уже установлено, когда @Postconstruct init() метод вызывается, так как последнее свойство не изменяется со значения по умолчанию true на false. Кроме того, я получаю ORA-00942: таблица или представление не существует из метода save(). Пул пользователей в пуле соединений jdbc, определенный в glassfish-resources.xml, не имеет доступа к таблицам, как и прокси-пользователь 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>

1 ответ

Я не думаю, что PostConstruct является правильным местом для этого.

Новый EntityManager привязан к контексту постоянства на каждой границе транзакции, поэтому вам нужно установить это свойство в начале каждого транзакционного метода SessionBean. Вы также можете использовать SessionEvents в EclipseLink для настройки свойств.

Если ваши свойства фиксированы, вы также можете поместить их в свой файл persistence.xml.

См. Http://wiki.eclipse.org/EclipseLink/Examples/JPA/Auditing#Use_Oracle_proxy_authentication_to_allow_a_shared_connection_pool_and_a_user_context

Другие вопросы по тегам