【发布时间】:2016-11-24 13:32:52
【问题描述】:
我想在我的数据库中登录对表执行的操作(插入、更新和删除)。我一直在阅读有关拦截器的信息,所以我实现了自己的。
例如,当执行插入时,我会这样做:
@Override
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
if (entity instanceof Person) {
System.out.println("Se ha insertado una persona");
operation = "Insert";
date = Calendar.getInstance().getTime();
return true;
}
return false;
}
最后在 postFlush 我这样做了:
// called after committed into database
public void postFlush() {
System.out.println("postFlush");
Session ses = HibernateUtil.getSessionFactory().openSession();
ses.getTransaction().begin();
Registry reg = new Registry(operation, date);
ses.save(reg);
ses.getTransaction().commit();
}
在注册表中,我存储有关在我正在检查的表上执行的操作的信息。
我在使用保存、更新和删除方法调用类上的拦截器时遇到了很多问题。在互联网和这里(我喜欢这个网站 jeje)上阅读数小时后,我能够以这种方式调用拦截器:
Session session = this.sessionFactory.withOptions().interceptor(new MyInterceptor).openSession();
我运行我的简单网络应用程序来保存一个人的姓名和国家/地区。我能够存储此人的信息,但我的注册表是空的。我调试了我的代码,并且从未调用过 postFlush 方法。有任何想法吗?我遵循了各种教程和一些建议,但似乎没有任何效果。
我尝试的最后一件事是以一种非常“肮脏”的方式。我从这里更改了我的代码:
@Override
@Transactional
public void addPerson(Person p) {
Session session = this.sessionFactory.withOptions().interceptor(new MyInterceptor).openSession();
session.save(p);
logger.info("Person saved successfully, Person Details="+p);
}
到这个(可怕的)方式:
@Override
@Transactional
public void addPerson(Person p) {
MyInterceptor m = new MyInterceptor();
Session session = this.sessionFactory.withOptions().interceptor(m).openSession();
Transaction tx = session.beginTransaction();
session.save(p);
tx.commit();
session.flush();
m.postFlush();
logger.info("Person saved successfully, Person Details="+p);
}
它奏效了!我能够在注册表中存储人员信息,但这不是正确的方式吗?
提前致谢
【问题讨论】:
标签: java spring hibernate interceptor