2011-11-11 39 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中检索)。