2011-11-11 38 views
1

我使用JBOSS seam和Hibernate作爲JPA提供程序。如何刪除在Persistence.xml中配置的編程屬性

在我的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> 

在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.But它仍然使用之前配置的攔截器。

代碼我使用,以去除Hibernate的版本是您使用攔截

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

回答

0

只是刪除屬性是不夠的,你必須直接從Hibernate中刪除初始化的攔截器 - 也通過反射API。在sessionFactory是字段sessionFactoryOptions,它包含對實例的引用,所以你可以嘗試刪除它。

編輯:其實你可以嘗試用EmptyInterceptor來取代它,因爲空是不行的(你會在沖洗得到空指針)

該解決方案旨在爲全球的使用。對於本地使用,您必須替換當前會話中的攔截器(可以從entityManager中檢索)。