手动设置实体的ID

时间:2015-06-08 08:54:20

标签: jspresso

我面临一个我无法理解的小问题。 使用这段代码:

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")

知道为什么我要面对这个问题吗?

1 个答案:

答案 0 :(得分:0)

Jspresso根据 id 计算实体的哈希码。 Jspresso在内部间接使用此哈希码来执行某些控件和其他操作,方法是在Hash[Map|Set]中使用它。

这就是为什么强制要求:

  1. 在对实体执行任何setter或操作之前,只要创建实体实例,就会分配id。
  2. 在实体的生命周期内,ID不会更改。
  3. 致电时:

    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分配给实体并在之后执行所有必要的操作。