我面临一个我无法理解的小问题。 使用这段代码:
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")
知道为什么我要面对这个问题吗?
答案 0 :(得分:0)
Jspresso根据 id 计算实体的哈希码。 Jspresso在内部间接使用此哈希码来执行某些控件和其他操作,方法是在Hash[Map|Set]
中使用它。
这就是为什么强制要求:
致电时:
IEntity myEntity = entityFactory.createEntityInstance(MyEntity.class)
将生成的ID分配给实体。
在方案1中,首先更改id(打破哈希码),然后调用setter。 Jspresso认为这个实体没有被正确注册,因为它无法从内部的基于哈希码的存储中检索它的id。
在方案2中,相同的违规行为,但您在更改ID之前调用了setter 。但我想如果你之后再打电话给另一个二传手,它就会失败。
解决方案是使用允许将id作为参数传递的entityFactory
create方法的其他签名,例如
IEntity myEntity = entityFactory.createEntityInstance(MyEntity.class, "anId")
myEntity.setReferenceProperty(someReference)
将立即将您的ID分配给实体并在之后执行所有必要的操作。