EclipseLinkとHibernateではTemporalType.DATEなフィールドの型が違う
かなり久々のJPAネタ。
こんなエンティティクラスがあって、
@Entity public class Employee implements Serializable { @Id @Column(name = "emp_id") private Integer empId; @Temporal(TemporalType.DATE) @Column(name = "joined_date") private java.util.Date joinedDate;
joinedDate
というフィールドはjava.util.Date
型、そして@Temporal(TemporalType.DATE)
が付いています。
これをEclipseLinkで実行すると、joinedDate
にはjava.util.Date
型のインスタンスが代入される。
一方、Hibernateで実行すると、joinedDate
にはjava.sql.Date
型のインスタンスが代入される。(java.sql.Date
はjava.util.Date
のサブクラスです)
Webアプリのビューでそのまま表示すると、Payara(JPA実装がEclipseLink内包)だと「Wed Apr 01 00:00:00 JST 2015」という形式なのに、
WildFly(JPA実装がHibernate)だと「2015-04-01」という形式になったので、アレ?と思って、
employee.getJoinedDate().getClass().getName()
してクラス名を表示したらこんな感じになってました。
jug-action-based-mvcプロジェクトにテストコードを追加しました。
EmployeeDaoのテストコードを追加 · MasatoshiTada/jjug-action-based-mvc@2edd12b · GitHub