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の中では使用頻度が低いと思うので、機会をみて他のでも比べてみよう。