JPAの微妙なところでEclipseLinkとHibernateを比べてみる @OneToMany(1)

ということで、@OneToManyをEclipseLinkとHibernateで使い比べてみました。
※Derbyを使用しています。

@Entity
public class Parent implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;
    private String name;
    @OneToMany(fetch= FetchType.EAGER, cascade= CascadeType.ALL)
    private List<EChild> echildren;
    @OneToMany(fetch= FetchType.LAZY, cascade= CascadeType.ALL)
    private List<LChild> lchildren;
}
@Entity
public class EChild  implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;
    private String name;
}
@Entity
public class LChild  implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;
    private String name;
}

※アクセサは省略しています。

このクラスからは以下の様なテーブルが自動生成されます。


さて、これに対し、以下の様なJPQLを発行します。

select p from Parent as p
EclipseLink2.4.0の場合

以下の様なSQLが発行されていました。

SELECT ID, NAME FROM PARENT

SELECT t1.ID, t1.NAME FROM PARENT_ECHILD t0, ECHILD t1 WHERE ((t0.Parent_ID = ?) AND (t1.ID = t0.echildren_ID)) //Parentの数分繰り返し
Hibernate4.1.9.Finalの場合

以下の様なSQLが発行されていました。

select parent0_.id as id0_, parent0_.name as name0_ from Parent parent0_

select echildren0_.Parent_id as Parent1_0_1_, echildren0_.echildren_id as echildren2_4_1_, echild1_.id as id2_0_, echild1_.name as name2_0_ from Parent_EChild echildren0_ inner join EChild echild1_ on echildren0_.echildren_id=echild1_.id where echildren0_.Parent_id=? //Parentの数分繰り返し

以前、全部LazyじゃなくてEagerでいいんじゃないかとブログに書いたことがあったけれども、これだとLazyで必要なときにだけ取ってくるのとあまり変わらない。
Hibernate3.6の頃だと結合して一度で取ってきていた記憶があったのだけれども、変わったのだろうか。うーん。

今回の結合方法はOneToManyの中では使用頻度が低いと思うので、機会をみて他のでも比べてみよう。