【发布时间】:2010-12-06 19:03:07
【问题描述】:
我需要知道如何设置 Hibernate (...) 以实现以下问题:
我有一个双向(组合)一对多关联(a.bs 是 Set 对象,b.a 是 A 对象)。当我从 DB 加载“a”并更新其中一个“bs”时,我需要 Hiernate 在 saveOrUpdate A 时拦截 A 实体。
代码:
public class A {
Set<B> bs = new HashSet<B>();
// ... other fields and setters/getters
}
public class B {
A a = null;
// ... other fields and setters/getters
}
用例:
A a = load("idA"); // load A from DB
B b = s.getBById("idB"); // get a B element of A
b.setName("blablabla"); // update a field of B
saveOrUpdate(a); // persist A entity with its Bs (including modified B)
执行更改是因为(迷你)模型已正确注释。
问题是我的拦截器只检测到B实体的变化,而不是A。我需要检测A的变化,因为我需要更新审计信息。
另一种观点是:我需要通过B获取A实体并更新它。其实我可以从 B 得到 A,但是改变没有持久化...
简化问题: 当我的拦截器拦截 B 实体时,我必须修改 A 实体(设置日期)。它在 onSave 中可以正常工作,但在 onFlushDirty 中却不行。为什么?
这是: 当 B 被更新时,被拦截(onFlushDirty)。 onFlushDirty 方法的主体,除其他外,这样做:
b.getA().setLastModifyDate(new Date());
所以,在那一刻,附加到会话的 A entity 应该变脏,因此它应该引发拦截动作......我的意思是,应该再次调用 onFlushDirty 方法,他的时间是 A 实体。我错了吗? 但是,无论如何,应该更新 A.lastModifyDate ......这不会发生!!!
下面我展示了我的应用程序的实际行为:
- 我创建了一个 A 对象
- 我创建了一个 B 对象并将其关联到 A
我坚持 A => A.lastModifyDate 是正确的日期 (OK)
我创建了一个 A 对象
- 我创建了一个 B 对象并将其关联到 A
- 我坚持 A => A.lastModifyDate 是正确的日期 (OK)
我加载 B 对象,我更新它并坚持 B -> A.lastModifyDate 是正确的日期(OK)
我创建了一个 A 对象
- 我创建了一个 B 对象并将其关联到 A
- 我坚持 A => A.lastModifyDate 是正确的日期 (OK)
我加载 A 对象,更新其 B 对象并坚持 A -> A.lastModifyDate 不是正确的日期 (KO)
我创建了一个 A 对象
- 我创建了一个 B 对象并将其关联到 A
- 我坚持 A => A.lastModifyDate 是正确的日期 (OK)
我加载 A 对象,更新任何 A 的字段及其 B 对象,并坚持 A -> A.lastModifyDate 不是正确的日期(KO)
我创建了一个 A 对象并将其持久化。
我加载了 A 对象,我将一个新的 B 对象关联到它,并且我坚持 A => A.lastModifyDate 是正确的日期 (OK)
我创建了一个 A 对象并将其持久化。
- 我加载 A 对象,我更新任何 A 的字段,我将一个新的 B 对象关联到它,我坚持 A => A.lastModifyDate 是正确的日期(OK)
有什么想法吗?
谢谢!
【问题讨论】:
-
你能澄清一下你所说的“拦截”是什么意思吗?真正的拦截器?事件监听器?级联行为?
-
实际拦截器!我不使用监听器。
标签: hibernate interceptor