【问题标题】:Hibernate interceptor - set property to nullHibernate 拦截器 - 将属性设置为 null
【发布时间】:2012-08-17 14:41:53
【问题描述】:

我实现了一个 Hibernate 拦截器(扩展 EmptyInterceptor)并实现了 onFlushDirty 方法,以便在保存对象时将对象的属性设置为 null。代码如下所示:

public boolean onFlushDirty(...) {
// looking for the property index
int i = 0;
for (i=0; i<propertyNames.length; i++) {
  if ("someProperty".equals(propertyNames[i])) {
    break;
  }
}

// setting it to null
currentState[i] = null;

不幸的是,即使我取消了该对象,该记录仍会保存到数据库中。奇怪的是,当我修改该对象时,更改会保存到数据库中。

对象和属性都是实体。

【问题讨论】:

  • 您确定正在调用拦截器吗?你能放置一个系统输出并确认吗?
  • 是的,正在调用拦截器。我已经使用 sysout 和调试器进行了检查。

标签: hibernate interceptor


【解决方案1】:

我很确定在这种情况下不会调用拦截器...

您能否在保留数据的同时尝试此操作...

session.evict(entity);
session.update(entity);

并发布调查结果。这将force休眠调用onFlushDirty。

还将@Override 注释放在onFlushDirty 上,以确保它被正确覆盖。

【讨论】:

  • 正在调用拦截器。存在 @Override 注释,当向方法添加日志输出时,它会被打印出来。
【解决方案2】:

问题在于,即使在拦截器运行之前,实体也已保存到数据库中。这是因为它是一个实体,需要在hibernate在另一个实体中引用它之前保存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多