1

我在这里遇到了一个我无法理解的小问题。使用这段代码:

IEntity myEntity = controller.entityFactory.createEntityInstance(MyEntity.class)
myEntity.straightSetProperty(IEntity.ID, "anId")
myEntity.setReferenceProperty(someReference)

我收到“UOW 使用不当”错误

BAD SESSION USAGE您正在修改之前未在会话中合并的实体 ()[MyEntity]。您应该首先使用 backendController.merge(...) 方法在会话中合并您的实体。正在修改的属性是 [referenceProperty]。

但是换线的时候就没事了

IEntity myEntity = controller.entityFactory.createEntityInstance(MyEntity.class)
myEntity.setReferenceProperty(someReference)
myEntity.straightSetProperty(IEntity.ID, "anId")

知道为什么我会面临这个问题吗?

4

1 回答 1

0

Jspresso 根据其id计算实体的哈希码。Jspresso 内部间接使用此哈希码通过在.Hash[Map|Set]

这就是为什么它是强制性的:

  1. 一旦创建实体实例并且在实体上执行任何设置器或操作之前,就会分配 id。
  2. id 在实体的生命周期内不会改变。

你打电话时 :

IEntity myEntity = entityFactory.createEntityInstance(MyEntity.class)

生成的 id 被分配给实体。

在场景 1 中,您首先更改 id(这会破坏哈希码),然后调用 setter。Jspresso 认为该实体未正确注册,因为它无法从基于哈希码的内部存储中检索其 ID。

在场景 2 中,同样的违规行为,但您在更改 id之前调用了 setter。但我想如果你之后调用另一个 setter,它会以同样的方式失败。

entityFactory解决方案是使用允许将 id 作为参数传递的 create 方法的另一个签名,例如

IEntity myEntity = entityFactory.createEntityInstance(MyEntity.class, "anId")
myEntity.setReferenceProperty(someReference)

这将立即将您的 id 分配给实体并在之后执行所有必要的操作。

于 2015-06-10T04:46:43.683 回答