繁体   English   中英

从数据库端进行更改时未调用Hibernate Event Listener

[英]Hibernate Event Listener Not Called when changes made from DB side

我是休眠的新手。 我发现我们可以在Hibernate中使用事件侦听器,该事件侦听器将通知我们有关数据库的更改。 我感兴趣的是,如果我没有通过Java应用程序而是仅通过DB进行任何DB更改,那么是否将调用Java代码。 这是我编写的代码:

  1. Hibernate CFG文件和对应的HBM文件

<session-factory>
  <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
  <property name="hibernate.connection.url"></property>
  <property name="hibernate.connection.username"></property>
  <property name="hibernate.connection.password"></property>
  <property name="hibernate.connection.pool_size"></property>
  <property name="show_sql">true</property>
  <property name="dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
  <!-- Mapping files -->
  <mapping resource="hbm/ps.hbm.xml"/>

    <listener type="post-insert" class="com.Dummy"/>

</session-factory>
</hibernate-configuration>
<hibernate-mapping>
<class name="com.Bean" table="Demo">
    <id name="id" type="string" column="ID" />
    <property name="name" type="string" column="NAME"></property>
</class>

  1. 实现PostInsertListener的侦听器类:

     import org.hibernate.Session; import org.hibernate.event.PostInsertEvent; import org.hibernate.event.PostInsertEventListener; public class Dummy implements PostInsertEventListener { /** * */ private static final long serialVersionUID = 1L; @Override public void onPostInsert(PostInsertEvent event) { // TODO Auto-generated method stub System.out.println(event.getEntity() instanceof Bean); System.out.println("Inside onPostInsert"); Session session = event.getSession(); System.out.println(session.toString()); } } 

主类:

public class Run {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try{
        System.out.println("Here");
        Configuration cfg = new Configuration().configure();
        SessionFactory factory = cfg.buildSessionFactory();
        Session session =     factory.openSession();
        Transaction tx = session.beginTransaction();
        Bean bean= new Bean();
        bean.setId("4");
        bean.setName("Dummy");
        System.out.println("Before Insert");
        session.save(bean);
        System.out.println("After Save");
        tx.commit();
        System.out.println("After Commit");
        session.close();
        factory.close();
    }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

当我运行主类Inserts in DB时,该代码运行起来很神奇,因为它应该按预期调用onPostInsert方法,但是如果我运行该应用程序并从DB中进行更改,即插入列,则控制台不会打印任何内容。 有什么我想念的吗? 我正在使用SQL Server ...数据库是否存在任何兼容性问题? 真的搞砸了这个需要帮助..... :)

不,直接在数据库上进行的更改不会在您的应用程序中调用侦听器。

大量更新/删除与休眠一起发出不会调用侦听器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM