1

春、ダービー、JPAを使用しているこのテスト設定があり、更新が機能するかどうかをテストしたいと思います。

私はこれを標準的な方法で行うことはできません。エンティティ オブジェクトを作成し、保持し、オブジェクトを再度検索し、オブジェクト内のフィールドを変更し、再度保持し、変更されたかどうかを確認するために検索を実行します。

このアプローチの問題は、エンティティの新しいインスタンスを取得できないことです。いつも同じです。したがって、常に同じオブジェクトを変更しているため、更新が正しく機能するかどうかはわかりません。そのため、変更が時期尚早に反映されます。

一部のオブジェクトを永続化コンテキストとマージせずに変更し、そのオブジェクトで検索を実行しようとすると、常に同じオブジェクトで動作しているため、変更は既に検索に存在します。

コンテキストを失い、更新が正しく機能していることを実際にテストする方法はありますか?

これが私の現在のコードです:

@Test
public void canUpdate() {

    JsonTestEntity entity1 = new JsonTestEntity();
    JsonTestEntity entity2 = new JsonTestEntity();

    String message = "OmegaCV1";
    String message2 = "OmegaCV2";

    entity1.setMessage(message);
    entity2.setMessage(message2);

    em.persist(entity1);
    em.persist(entity2);

    em.flush();

    JsonTestEntity jsonTestEntity = em.find(JsonTestEntity.class, entity2.getId());

    assertNotNull("Could not find persisted entity", jsonTestEntity);
    assertEquals("Was not same entity", message2, jsonTestEntity.getMessage());

    String changeMessage = "Changed message";
    jsonTestEntity.setMessage(changeMessage);

    JsonTestEntity unChangedEntity = em.find(JsonTestEntity.class, entity2.getId());

    assertEquals("Message was prematurely changed", message2, unChangedEntity.getMessage());
    em.merge(jsonTestEntity);

    JsonTestEntity changedEntity = em.find(JsonTestEntity.class, entity2.getId());
    assertEquals("Message was not changed", changeMessage, changedEntity.getMessage());
}
4

4 に答える 4

3

EntityManager の第 1 レベルのキャッシュを無効にする可能性があれば、問題は解決します :)

だから私はいくつかのアイデアがあります:

  1. EntityManager がトランザクションごとの場合、異なるトランザクションでpersist()andを実行するだけです。find()

  2. 使用em.clear()- すべての管理対象エンティティを切り離します。em.flush()この前に変更をコミットすることを忘れないでください。

  3. Hibernate を使用している場合は、セッションの後persist().flush()にセッションをクリアします。

    セッション セッション = em.unwrap(Session.class); session.flush(); session.clear();

  4. また、エンティティの状態をリロードすることもできますSession.refresh()

ドキュメント:

于 2013-10-03T13:35:49.207 に答える
0

したがって、これを修正する方法は次のとおりです。

@Test
public void canUpdate() {

    JsonTestEntity entity1 = new JsonTestEntity();
    JsonTestEntity entity2 = new JsonTestEntity();

    String message = "OmegaCV1";
    String message2 = "OmegaCV2";

    entity1.setMessage(message);
    entity2.setMessage(message2);

    em.persist(entity1);
    em.persist(entity2);

    em.clear(); // Clears the entitymanager so jsonTestEntity != entity2

    JsonTestEntity jsonTestEntity = em.find(JsonTestEntity.class, entity2.getId());

    assertNotNull("Could not find persisted entity", jsonTestEntity);
    assertEquals("Was not same entity", message2, jsonTestEntity.getMessage());

    String changeMessage = "Changed message";
    jsonTestEntity.setMessage(changeMessage);

    em.clear(); // same reason as above, I cannot however use flush here as that would commit the changed message

    JsonTestEntity unChangedEntity = em.find(JsonTestEntity.class, entity2.getId());

    assertEquals("Message was prematurely changed", message2, unChangedEntity.getMessage());
    em.merge(jsonTestEntity);

    em.flush(); // since merge performs an update in this case, I need to flush to commit the update, after the flush --> unchangedEntity.getMessage().equals(jsonTestEntity.getMessage())
    em.clear(); // I clear again to get separate objects

    JsonTestEntity changedEntity = em.find(JsonTestEntity.class, entity2.getId());
    assertEquals("Message was not changed", changeMessage, changedEntity.getMessage());


}
于 2013-10-03T21:30:08.293 に答える