2011-07-26 13 views
2

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を削除すると、すべてが正常に動作します。 これを動作させる方法はありますか? それ以外の場合は、テスト後に手動でデータベース内に作成されたエンティティを手動で削除する必要があります。これはかなり不便です。

回答を募集しています。

ありがとうございました。

+0

おそらく 'd1.setEndUser(e1)'は役に立ちますか? – marc

+1

それは私が推測するのに役立ちます。私は、非トランザクションテストでは意図したとおりに動作しますが、トランザクションテストでは動作しないと思います。 – chzbrgla

+1

'd1.setEndUser(e1);'を追加してもうまくいきますが、回避策があります。このような回避策がなくても動作するようにする必要があります。 @transactionalがなければ、それは働いています... – drame

答えて

1

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

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

+0

ありがとうございます。 clear()トリックをやった。 キャッシュに何らかのキャッシュがあることに気がつきましたが、セッションに入っていることが分かりませんでした。 ^^ – drame

関連する問題