DAOObjectをテスト中に問題が発生しました。 @oneToOneの関係でリンクされている2つのエンティティがあります。 クラスは以下のとおりです。Spring、Hibernate @OneToOneトランザクションテストの問題
私は次の操作を行うDAOで@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
}
:(どちらもsession.flush、あなたが見ることができるよう
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
)もHibernate.Initalize働くendUserはデバイスに割り当てられていません。 @Transactionalを削除すると、すべてが正常に動作します。 これを動作させる方法はありますか? それ以外の場合は、テスト後に手動でデータベース内に作成されたエンティティを手動で削除する必要があります。これはかなり不便です。
回答を募集しています。
ありがとうございました。
おそらく 'd1.setEndUser(e1)'は役に立ちますか? – marc
それは私が推測するのに役立ちます。私は、非トランザクションテストでは意図したとおりに動作しますが、トランザクションテストでは動作しないと思います。 – chzbrgla
'd1.setEndUser(e1);'を追加してもうまくいきますが、回避策があります。このような回避策がなくても動作するようにする必要があります。 @transactionalがなければ、それは働いています... – drame