Как удалить программно свойства, настроенные в Persistence.xml - PullRequest
1 голос
/ 11 ноября 2011

Я использую шов JBOSS с Hibernate в качестве поставщика JPA.

В моем файле Persistence.xml

   <properties>
            <!-- Basic -->
            <property name="hibernate.connection.driver_class"        value="org.gjt.mm.mysql.Driver"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
            <property name="hibernate.ejb.interceptor"   value="com.wi.test.audit.ActivityInterceptor"/>
    </properties>

In Components.xml

<persistence:entity-manager-factory name="entityManagerFactory" persistence-unit-name="mydb" />
    <persistence:managed-persistence-context name="entityManager" auto-create="true" entity-manager-factory="#{entityManagerFactory}" />
    <transaction:entity-transaction entity-manager="#{entityManager}" />
    <factory
        name="session" 
        scope="STATELESS" 
        auto-create="true" 
        value="#{entityManager.delegate}"
    />

Сейчас вВ моей программе я хочу удалить перехватчик, который я настроил, удалив свойство hibernate.ejb.interceptor.

Я попытался получить карту свойств, удалить свойство перехватчика и создать новый entitymanager. Но он все еще используетперехватчик настроен ранее.

код, который я использую для удаления перехватчика

Field f = SessionFactoryImpl.class.getDeclaredField("properties");
        f.setAccessible(true);
        Properties p = (Properties)f.get(session.getSessionFactory());
        Map<String, String> map = new HashMap<String, String>((Map) p);
        map.remove("hibernate.ejb.interceptor");
        localSession =(Session)entityFactory.createEntityManager(map).getDelegate();

1 Ответ

0 голосов
/ 20 октября 2014

Какую версию Hibernate вы используете?

Недостаточно просто удалить свойство, вы должны удалить инициализированный перехватчик из Hibernate напрямую - также через API отражения.На sessionFactory есть поле sessionFactoryOptions, которое содержит ссылку на экземпляр, поэтому вы можете попытаться удалить это.

РЕДАКТИРОВАТЬ: На самом деле вы можете попытаться заменить его на EmptyInterceptor, потому что null не будет работать (вы получите nullPointer при сбросе)

Это решение предназначено для глобального использования.Для локального использования вы должны заменить перехватчик в текущем сеансе (может быть получен из entityManager).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...