Springframeworkとの統合テストを行うときにSetがHibernateプロキシの代わりにnullの場合、何が欠けていますか?

私は冬眠するのが初めてで、ゲートからテストしてすぐに始めることを試みています。私はこの分野でのGrailsの使いやすさに甘んじています...私はSpringframework 3.0.6とHibernate 3.6.8とJunit 4.9を使用しています。

次のテストでイベントオブジェクトのEventAttribute SetがHibernateProxyオブジェクトのセットとして「参照」されない理由を理解しようとしていますが、単純にnullになります。また、イベントの複合プロパティ(他のテーブルのオブジェクトで作成されたプロパティ)の一部に従うと、値も表示されず、nullが表示されます。

オブジェクトはDAOでうまく保存され、簡単なプロパティ(同じテーブルのプロパティ)を見ることができます。しかしassertNotNullは以下のテストで失敗します。

私の推測では、セッションが既に閉じられているなど、何かが私のテスト構成でオフになっているということです。思考?

モデル:

@Entity
@Table(name = "event")
public class Event {

  /**
      ... some other properties ...
  */

  @OneToMany(mappedBy = "event")
  private Set eventAttributes = new HashSet(0);

  /**
      ... getters and setters ...
  */
}

@Entity
@Table(name = "event_attribute")
public class EventAttribute {

  /**
      ... some other properties ...
  */
  @ManyToOne(fetch = FetchType.LAZY)
  @ForeignKey(name = "FK_event_attribute_event")
  @JoinColumn(name = "event_id", nullable = false)
  private Event event;

  /**
      ... getters and setters ...
  */
}

私のテスト設定:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("dao-testConfig.xml")
@TransactionConfiguration(defaultRollback = false)
@Transactional
public class EventAttributeDaoTest  {

  @Test
  public void save(){
    EventAttribute eventAttribute = new EventAttribute("a key", "a value", event);
    dao.save(eventAttribute);

    Event event2 = eventDao.getEventById(event.getId());
    assertNotNull(event2.getEventAttributes());
  }
}
1

1 答え

問題は、休止状態があなたのために双方向リレーションシップの両端を維持しないことです。

したがって、実際にデータベースからイベントをリロードしない限り、セットは更新されません。あなたのケースでは、問題は、 event2 がデータベースから再度ロードされないことです。なぜなら、現在の休止状態のセッションですでに終了しているからです。

You can prove that by assertSame(event2, event) //notice that SAME not only EQUALS

したがって、2番目のイベントをロードする前にセッションをフラッシュしてクリアした場合、hibernateは実際にdbからロードして新しいオブジェクトインスタンスを作成します。この場合、期待通りに set を初期化します。

But: I my humble opinion, this is poor code. Better is to maintain both sides of the relationship by hand. So if you create an new EventAttribute, it should itselfe register to the Event, the same for changing. So that in the end the releatinship is correct maintained, even if the Object is not stored in the database.

0
追加された
@ダニエル:奇妙に聞こえる "しかし、私は参加者の詳細のいずれかを見ることができません。コードのように詳細を投稿してください。 (Persistence.xml、Test、...)
追加された 著者 Ralph,
これは知っておくと良いことです。私は、冬眠がまったく同じオブジェクトを私に返すことは知らなかった。しかし、私の問題は、単に返されていないセットよりもわずかに大きいです。テストでは、イベントオブジェクトの一部としての単純型よりも、オブジェクトグラフの中の何かを見ることができません。たとえば、イベントの日付とIDを確認できますが、参加者の詳細は表示されません。
追加された 著者 Daniel Bower,