当前位置: 首页 > 面试题库 >

Spring + EntityManagerFactory +休眠监听器+注入

臧威
2023-03-14
问题内容

我有一个简单的问题。是否可以通过@Ressource或@Autowired向Hibernate Eventlistener添加依赖项注入?

我将向您展示我的entitymanagerfactory配置:

<bean id="entityManagerFactory" class="org.hibernate.ejb.EntityManagerFactoryImpl">
    <qualifier value="entityManagerFactory" />
    <constructor-arg>
        <bean
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="persistenceUnitManager">
                <bean
                    class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManagerr">
                    <property name="defaultDataSource" ref="dataSource" />
                </bean>
            </property>
            <property name="dataSource" ref="dataSource" />
            <property name="persistenceUnitName" value="mis" />
            <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence" />
            <property name="jpaProperties" ref="jpa.properties" />
            <property name="jpaDialect" ref="jpaDialect" />
            <property name="jpaVendorAdapter">
                <bean
                    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="generateDdl" value="true" />
                    <property name="database">
                        <util:constant
                            static-field="org.springframework.orm.jpa.vendor.Database.POSTGRESQL" />
                    </property>
                    <property name="showSql" value="true" />
                </bean>
            </property>

        </bean>
    </constructor-arg>
</bean>

目前,我通过jpa.properties注册了我的监听器,

hibernate.ejb.event.load=com.example.hibernate.events.LoadEvent

但是在这种情况下,我的听众没有弹簧注入。我找到了一个解决方案,但是它使用了sessionFactory而不是objectmanager
oder我可以在我的上下文中修改sessionfactory吗?希望有人有一个好主意或解决方案如何解决这个问题!

太谢谢了!


问题答案:

如果您使用SessionFactory,则将是以下配置:

<bean id="mySessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <!-- Stripped other stuff -->
    <property name="eventListeners">
        <map>
            <entry key="pre-load">
                <bean class="com.mycompany.MyCustomHibernateEventListener1" />
            </entry>
            <entry key="pre-persist">
                <bean class="com.mycompany.MyCustomHibernateEventListener2" />
            </entry>
        </map>
    </property>
</bean>

但是由于您使用的是JPA,因此恐怕您需要使用此线程中概述的AOP

或者你可以

  1. 将ApplicationContext存储在ThreadLocal或自定义的holder类中,并通过静态方法公开它
  2. 为您的听众提供一个基类,如下所示:

基类:

public abstract class ListenerBase{

    protected void wireMe(){
        ApplicationContext ctx = ContextHelper.getCurrentApplicationContext();
        ctx.getAutowireCapableBeanFactory().autowireBean(this);
    }

}

现在在您的lifycycle方法中wireMe()先调用。

更新:

这是一个示例实现ContextHelper

public final class ContextHelper implements ApplicationContextAware{

    private static final ContextHelper INSTANCE = new ContextHelper();
    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext){
        this.applicationContext = applicationContext;
    }

    public static ApplicationContext getCurrentApplicationContext(){
        return INSTANCE.applicationContext;
    };

    public static ContextHelper getInstance(){
        return INSTANCE;
    }

    private ContextHelper(){
    }

}

将其连接到您的Spring Bean配置中,如下所示:

<bean class="com.mycompany.ContextHelper" factory-method="getInstance" />


 类似资料:
  • 问题内容: 我已经使用和事件监听器插入创建日期和表更新的日期。 我面临的问题是,当我将实体保存在数据库中的创建日期无法与在更新记录时插入更新日期相同的表中插入时,它也不会插入更新日期。 我的代码示例如下所示: 侦听器类别: hibernate连接类: DAO中的实体保存和更新方法: 我的测试班: 如果我使用的话,它将插入创建和更新的日期,但是每次我调用flush方法时都会执行更新的查询。目前,我评

  • 问题内容: 我有一个包含三个字段的表,例如a,b,c。我想添加一个约束,以确保如果a不为null,那么b和c也不为null。我已经使用以下SQL做到了 有没有一种方法可以使用hibernate注释@Check达到相同的效果? 我找不到带有该注释的有用示例,开发人员是否倾向于完全不使用它? 问题答案: 是的,可以在类级别使用,例如: (请注意,我使用@jarlh注释重写了您的情况。)该条款注释需要参

  • 主要内容:监听器的分类,监听对象创建和销毁的监听器,监听属性变更的监听器,监听 Session 中对象状态改变的监听器,注册监听器监听器 Listener 是一个实现特定接口的 Java 程序,这个程序专门用于监听另一个 Java 对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即自动执行。 监听器的相关概念: 事件:方法调用、属性改变、状态改变等。 事件源:被监听的对象( 例如:request、session、servletContext)。 监听器:用于监听事件源对象

  • 性能测试就是以各种形式分析服务器响应,然后将其呈现给客户端。 当JMeter的采样器组件被执行时,监听器提供JMeter收集的关于那些测试用例的数据的图形表示。它便于用户在某些日志文件中以表格,图形,树或简单文本的形式查看采样器结果。 监听器可以在测试的任何地方进行调整,直接包括在测试计划下。JMeter提供了大约15个监听器,但主要使用的是表,树和图形。 以下是JMeter中所有监听器的列表:

  • { "name": "...", "address": "...", "filters": [], "ssl_context": "{...}", "bind_to_port": "...", "use_proxy_proto": "...", "use_original_dst": "...", "per_connection_buffer_lim

  • Envoy配置顶层包含一个监听器列表。每个单独的监听器配置具有以下格式: v1 API参考 v2 API参考 统计 监听器 每个监听器都有一个以 listener.<address> 为根的统计树。统计如下: 名称 类型 描述 downstream_cx_total Counter 连接总数 downstream_cx_destroy Counter 销毁的连接总数 downstream_cx_a