如何删除Persistence.xml中配置的Programatically属性

时间:2011-11-11 19:55:03

标签: hibernate jpa

我正在使用JBOSS seam和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>

在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 :(得分:0)

您使用的是哪种Hibernate版本?

仅仅删除属性是不够的,你必须直接从Hibernate中删除初始化的拦截器 - 也可以通过反射API。在sessionFactory上是字段sessionFactoryOptions,它包含对实例的引用,因此您可以尝试删除它。

编辑:实际上你可以尝试用EmptyInterceptor替换它,因为null不起作用(你会在flush上得到nullPointer)

此解决方案适用于全球使用。对于本地使用,您必须替换当前会话中的拦截器(可以从entityManager中检索)。