小编the*_*edC的帖子

Hibernate Interceptor onFlushDirty使用相同的值多次调用

我的HibernateInterceptor出了问题.我扩展EmptyInterceptor并覆盖onFlushDirty方法.我使用此方法手动检查脏值(将先前值与当前值进行比较)以编写已更改实体的审计日志.问题是,在某些特定情况下,在调用方法onFlushDirty之前,相同的实体会多次传递给方法postFlush.之前的值和当前值不会因呼叫而发生变化.所以我的审计日志写了几次相同的更改.如果我的实体的变化(例如从属性NEWIN_PROGRESS)这一变化传递两次或更多次的onFlushDirty.为什么会这样?这是一种奇怪的行为,在我看来并不是预期的.

拦截器的调用onFlushDirty是由auto-flushHibernate 的行为引起的.在会话期间执行查询时,它会刷新会话中的所有脏实体.我希望这对于一个脏实体只做一次,但似乎即使在刷新后该实体仍被标记为"脏".然后在会话中再次执行另一个查询 - 再次刷新实体.旧值和当前值与第一次刷新时相同.

我尝试用测试用例重现这个问题,但我无法挑起这样的多次刷新.我希望你在我调试整个Hibernate代码之前,Hibernate专家可以帮助我解决这个问题.

干杯,克里斯

hibernate interceptor

7
推荐指数
1
解决办法
3781
查看次数

Activiti / Camunda 使用变量更改边界计时器

我有一个关于 Activiti/Camunda 中用户任务的计时器边界事件的特殊问题:

启动流程时,我使用流程变量设置计时器持续时间,并使用边界定义中的表达式来解析变量。边界事件是在用户任务上定义的。

<bpmn2:timerEventDefinition id="_TimerEventDefinition_11">
        <bpmn2:timeDuration xsi:type="bpmn2:tFormalExpression">${hurry}</bpmn2:timeDuration>
      </bpmn2:timerEventDefinition>
Run Code Online (Sandbox Code Playgroud)

在某些情况下,当计时器已经在运行时,可能会出现截止日期 (dueDate),因为受让人请求了更多时间。为此,我想更改定义截止日期的流程变量的值。

碰巧的是,该变量已经在流程开始时解析并设置为边界事件。

变量的任何进一步更改都不会影响边界计时器的 DueDate,因为它存储在数据库中,并且不会在变量值更改时更新。

我知道如何通过 Java API 更新作业元素的 DueDate,但我想提供一种通用方法,例如通过更改变量的值来设置它。

延长期限的最常见用例是边界计时器已经在运行时。

任何想法如何处理这个问题?

任何提示都非常受欢迎。干杯克里斯

timer boundary activiti camunda

5
推荐指数
1
解决办法
4284
查看次数

Java同步取决于方法参数

如何在方法参数值上提供同步?

使用“相同”参数值A的所有方法调用都应该同步。即使使用A的调用已在等待中,也可以访问具有不同参数值的方法调用,例如B。B的下一个并发调用还必须等待第一个B被释放。

我的用例:我想在ID级别上同步对JPA实体访问,但要避免悲观锁定,因为我需要某种队列。用于锁定的“ ”旨在作为实体ID-实际上是Java Long类型。

protected void entityLockedAccess(SomeEntity myEntity) {
    //getId() returns different Long objects so the lock does not work
    synchronized (myEntity.getId()) {
        //the critical section ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我阅读了有关锁定对象的信息,但不确定如何适合我的情况。在顶层,我想管理对执行关键代码的应用程序的特定REST调用。

谢谢克里斯

java rest synchronization synchronized

2
推荐指数
1
解决办法
625
查看次数