hibernate学習の第12編(続き)
「四」各特定のクラスは独立したテーブル(union-subclass)をマッピングします.すなわち、テーブルとサブクラス間の独立した一対一関係すべてのサブクラスのテーブルの情報は完全であり、テーブルを関連付ける必要はありません.person.hbm.xmlの構成は次のとおりです.
生成されたsql文は次のとおりです.
と書く
Hibernate: insert into person (name, age, id) values (?, ?, ?)
Hibernate: insert into worker (name, age, work_year, id) values (?, ?, ?, ?)
Hibernate: insert into farmer (name, age, farm_name, id) values (?, ?, ?, ?)
Hibernate: select person0_.id as id8_0_, person0_.name as name8_0_, person0_.age as age8_0_, person0_.work_year as work1_9_0_, person0_.farm_name as farm1_10_0_, person0_.clazz_ as clazz_0_ from ( select null as work_year, id, age, name, null as farm_name, 0 as clazz_ from person union select work_year, id, age, name, null as farm_name, 1 as clazz_ from worker union select null as work_year, id, age, name, farm_name, 2 as clazz_ from farmer ) person0_ where person0_.id=?
実行後、データベース内のテーブル構造は、personテーブル:+----+----+----+----+----+----+----+--------+----------------------------+--------+--------+----------------------------------------+------------------------------------------------------------------------------------------------year|+----+----+----+----+--------+|2|worker|30|11|+----+----+----+----+----+----farmer表:+----+----+--------+|id|age|farm_name|+----+----+----+----+----+|3|farmer|31|little candy|+----+----+----+----+----+注意:プライマリキージェネレータを高低キージェネレータに変更しました.nativeは使用するデータベースに基づいて自動的に対応するプライマリ・キーの生成方法を選択するため、mysqlデータベースを使用しているため、プライマリ・キーフィールドは自動的に増加します.つまり、3つのテーブルに同じプライマリ・キーidがあります.これにより、クエリ中に問題が発生します.idが1のpersonを調べると、3つの表から結果が得られます.これは明らかにだめです.したがって,ここでは高低キーhilo生成方式を用いると,このような問題は起こらない.上の表のデータからもわかります.3つのテーブルのidは互いに異なる.この設計はより実際のニーズに合っている.補足:また、親クラスが抽象クラスである場合があります.これにより、データベースにテーブルを生成する必要がなくなります.これはプロパティを追加して構成するだけです:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="hibernate.extend" auto-import="false">
<class name="Person" table="person">
<id name="id">
<generator class="hilo"/>
</id>
<property name="name"/>
<property name="age"/>
<union-subclass name="Worker" table="worker">
<property name="work_year"/>
</union-subclass>
<union-subclass name="Farmer" table="farmer">
<property name="farm_name"/>
</union-subclass>
</class>
</hibernate-mapping>
生成されたsql文は次のとおりです.
と書く
Hibernate: insert into person (name, age, id) values (?, ?, ?)
Hibernate: insert into worker (name, age, work_year, id) values (?, ?, ?, ?)
Hibernate: insert into farmer (name, age, farm_name, id) values (?, ?, ?, ?)
Hibernate: select person0_.id as id8_0_, person0_.name as name8_0_, person0_.age as age8_0_, person0_.work_year as work1_9_0_, person0_.farm_name as farm1_10_0_, person0_.clazz_ as clazz_0_ from ( select null as work_year, id, age, name, null as farm_name, 0 as clazz_ from person union select work_year, id, age, name, null as farm_name, 1 as clazz_ from worker union select null as work_year, id, age, name, farm_name, 2 as clazz_ from farmer ) person0_ where person0_.id=?
実行後、データベース内のテーブル構造は、personテーブル:+----+----+----+----+----+----+----+--------+----------------------------+--------+--------+----------------------------------------+------------------------------------------------------------------------------------------------year|+----+----+----+----+--------+|2|worker|30|11|+----+----+----+----+----+----farmer表:+----+----+--------+|id|age|farm_name|+----+----+----+----+----+|3|farmer|31|little candy|+----+----+----+----+----+注意:プライマリキージェネレータを高低キージェネレータに変更しました.nativeは使用するデータベースに基づいて自動的に対応するプライマリ・キーの生成方法を選択するため、mysqlデータベースを使用しているため、プライマリ・キーフィールドは自動的に増加します.つまり、3つのテーブルに同じプライマリ・キーidがあります.これにより、クエリ中に問題が発生します.idが1のpersonを調べると、3つの表から結果が得られます.これは明らかにだめです.したがって,ここでは高低キーhilo生成方式を用いると,このような問題は起こらない.上の表のデータからもわかります.3つのテーブルのidは互いに異なる.この設計はより実際のニーズに合っている.補足:また、親クラスが抽象クラスである場合があります.これにより、データベースにテーブルを生成する必要がなくなります.これはプロパティを追加して構成するだけです: