EJB 3.0(Public Draft)入門記 Java Persistence API Chapter2 その12
id:koichikさんにInheritanceアノテーションのdiscriminationValueについてコメントをいただきました。
ご指摘どおり、2.1.9.1 Abstract Entity Classesのサンプルコード内で使ったInheritanceアノテーションのdiscriminationValueがDDLに反映されないです。おかしいなぁ。コードはPersistent APIのドキュメントに載っていたもので@Inheritanceの箇所は変更を加えていないので間違っていはいないと思うのですが。
@DiscriminatorColumnを明示的に指定しないとhbm2ddlでは認識されないのかなぁとおもって明示的に指定してみましたがエンティティから生成されるDDLにDiscriminatorColumnは含まれませんでした。
仕方ないので@DiscriminatorColumnに指定したカラムをもつ親のテーブルEMPを自分で作成しなおしてみました。それからデータを作り、エンティティを取得するプログラムを動かしてみたのですが、エンティティの取得に@DiscriminatorColumnに指定したカラムは使われませんでした。
実行されたSQLはDiscriminatorのカラムを追加する前と同じく次のとおりでした。
select employee0_.id as id1_1_, employee0_.name as name1_1_, employee0_.address_id as address3_1_1_, employee0_1_.salary as salary2_1_, employee0_2_.hourlyWage as hourlyWage3_1_, case when employee0_1_.id is not null then 1 when employee0_2_.id is not null then 2 when employee0_.id is not null then 0 end as clazz_1_, address1_.id as id0_0_, address1_.name as name0_0_ from EMP employee0_ left outer join FT_EMP employee0_1_ on employee0_.id=employee0_1_.id left outer join PT_EMP employee0_2_ on employee0_.id=employee0_2_.id left outer join Address address1_ on employee0_.address_id=address1_.id where employee0_.id=?
case式のところが変わるのかなぁと思ったのですが特に変化なしです。
Chapter 9 のInheritanceアノテーションの説明部分に次の一文がありました。
For the SINGLE_TABLE mapping strategy, and potentially also for the JOINED strategy, the persistence provider will use a type discriminator column.
potentiallyが怪しい。これって「persistence providerは必ずしもJOINED strategyにdiscriminator columnを使う必要がない」という意味を含んでいるような。
そこでHibernateとOracleのドキュメント見てみました。
- Hibernate AnnotationsのドキュメントのJoined subclassesではdiscriminationValueには特に触れられていないです。
- OracleのJoined SubclassのサンプルではdiscriminationValue使ってます。
断言できませんが、HibernateはJoined Subclassのときはdiscriminator columnを使わない(discriminator columnが指定してあっても無視する)、ということでしょうか?
参考までにOracle版のEJBでdiscriminator columnが指定されたJoined SubclassのSQLを見てみたいなー。けど動かす気力なしです。