我需要知道如何设置 Hibernate (...) 以实现以下问题:
我有一个双向(组合)一对多关联(a.bs 是 Set 对象,ba 是 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 是正确的日期(确定)
我创建了一个 A 对象
- 我创建了一个 B 对象并将其关联到 A
- 我坚持 A => A.lastModifyDate 是正确的日期(确定)
我加载 B 对象,更新它并坚持 B -> A.lastModifyDate 是正确的日期(确定)
我创建了一个 A 对象
- 我创建了一个 B 对象并将其关联到 A
- 我坚持 A => A.lastModifyDate 是正确的日期(确定)
我加载 A 对象,更新其 B 对象并坚持 A -> A.lastModifyDate不是正确的日期(KO)
我创建了一个 A 对象
- 我创建了一个 B 对象并将其关联到 A
- 我坚持 A => A.lastModifyDate 是正确的日期(确定)
我加载 A 对象,更新任何 A 的字段及其 B 对象,并且我坚持 A -> A.lastModifyDate不是正确的日期(KO)
我创建了一个 A 对象并将其持久化。
我加载 A 对象,我将一个新的 B 对象关联到它,并且我坚持 A => A.lastModifyDate 是正确的日期(OK)
我创建了一个 A 对象并将其持久化。
- 我加载一个对象,我更新任何 A 的字段,我将一个新的 B 对象关联到它,我坚持 A => A.lastModifyDate 是正确的日期(OK)
任何的想法?
谢谢!