gpt4 book ai didi

java - 从数据库端进行更改时不会调用 Hibernate 事件监听器

转载 作者:行者123 更新时间:2023-12-01 09:32:24 24 4
gpt4 key购买 nike

我是 Hibernate 新手。我发现我们可以在 Hibernate 中拥有事件监听器,它会通知我们对数据库所做的更改。我感兴趣的是,如果我不通过Java应用程序而仅通过数据库进行任何数据库更改,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>

  • 监听器类实现 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();
    }
    }
    }

    当我运行主类插入数据库时​​,代码会发挥作用,因为它应该按预期调用 onPostInsert 方法,但如果我运行应用程序并从数据库进行更改,即插入一列,控制台不会打印任何内容。我有什么遗漏的吗?我正在使用 SQL Server...数据库有任何兼容性问题吗?真的搞砸了,需要帮助......:)

    最佳答案

    不,直接对数据库进行的更改不会调用应用中的监听器。

    使用 hibernate 发出的批量更新/删除不会调用监听器。

    关于java - 从数据库端进行更改时不会调用 Hibernate 事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39300414/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com