2

DAOObjectのテスト中に問題が発生しました。@oneToOneリレーションによってリンクされている2つのエンティティがあります。クラスは次のとおりです。

@Entity
@Table
public class Device extends HyEntity {

    @OneToOne(mappedBy = "device")
    private EndUser endUser;
    //getters+setters
}

@Entity
@Table
public class EndUser extends HyEntity {

    private String firstname;
    private String lastname;
    @OneToOne
    private Device device;
    //getters+setters
}

DAOで私は次のことをします:

    Device d1 = new Device();

    EndUser e1 = new EndUser();
    e1.setFirstname("Hans");
    e1.setLastname("Muster");
    e1.setDevice(d1);

    repo.saveEntity(d1);
    repo.saveEntity(e1);
    sf.getCurrentSession().flush();
    repo.updateEntity(d1);
    sf.getCurrentSession().flush();

    Assert.notNull(repo.getEndUserById(e1.getId()));
    Assert.notNull(repo.getEndUserById(e1.getId()).getDevice());
    Assert.notNull(repo.getDeviceById(d1.getId()));

    sf.getCurrentSession().flush();
    d1 = repo.getDeviceById(d1.getId());
    Hibernate.initialize(d1); 
    Hibernate.initialize(d1.getEndUser());
    Assert.notNull(repo.getDeviceById(d1.getId()).getEndUser()); //FAILS endUser of Device is always NULL

ご覧のとおり、session.flush()もHibernate.Initalizeも機能しません。エンドユーザーはデバイスに関連付けられていません。@Transactionalを削除すると、...すべてが正常に機能します。これを機能させる方法はありますか?そうしないと、テスト後にデータベースに作成されたエンティティを手動で削除する必要があります。これはかなり面倒です。

答えを期待しています。

前もって感謝します。

4

1 に答える 1

1

clear()最後のフラッシュの後にを追加する必要があります。それを見逃した場合、hibernateは、関係が更新されない内部キャッシュから正確に同じインスタンスを返します。

とにかく私の個人的な意見では、関係船を手で両側に設置しないのは悪い習慣です。-両側に設定しない場合は、エンティティがデータベースから再ロードされるように常に注意する必要があるためです。そして、データベースからエンティティをリロードしない場合は...(テストを参照)。

于 2011-07-26T13:21:29.217 に答える