1

ここで理解できない小さな問題に直面しています。このコードのチャンクを使用する:

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

「UOW の使用方法が正しくありません」というエラーが表示される

不適切なセッション使用法 以前にセッションでマージされていないエンティティ ()[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 を変更し (これによりハッシュコードが壊れます)、セッターを呼び出します。Jspresso は、内部のハッシュコード ベースのストレージから ID を取得できないため、このエンティティが正しく登録されていないと考えています。

シナリオ 2 では、同じ違反ですが、ID を変更する前にセッターを呼び出します。しかし、後で別のセッターを呼び出すと、同じように失敗すると思います。

entityFactory解決策は、id をパラメーターとして渡すことができる create メソッドの他のシグネチャを使用することです。

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

これにより、すぐに ID がエンティティに割り当てられ、その後必要なすべての操作が実行されます。

于 2015-06-10T04:46:43.683 に答える