ヒベルナ学習の第11編(1)


hibernateの継承マッピング「一」の表には相続木をマッピングし、discriminator(識別マーク)のWorkerとFarmerはPerson類Personのソースコードを継承しています。
package hibernate.extend;
public class Person {
private int id;
private String name;
private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
 
クラスのWorkカーのソースコードは以下の通りです。
package hibernate.extend;

public class Worker extends Person{

    public int getWork_year() {
        return work_year;
    }

    public void setWork_year(int work_year) {
        this.work_year = work_year;
    }
private int work_year;//     
}
 
クラスFarmerのソースコードは以下の通りです。
package hibernate.extend;
public class Farmer extends Person {
private String farm_name;//      

    public String getFarm_name() {
        return farm_name;
    }

    public void setFarm_name(String farm_name) {
        this.farm_name = farm_name;
    }
}
 
マッピングファイルは一つだけです。person.hbm.xml<?xml version=「1.0」encoding=「UTF-8」?DOCTYPE hibernate-mapping PUBLIC"-/Hibernate/Hibernate Mapping DT 3.0/EN"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">                                                                テストコード:
 static void add(){
        Person p = new Person();
        p.setName("person");
        p.setAge(22);

        Worker worker = new Worker();
        worker.setName("worker");
        worker.setAge(30);
        worker.setWork_year(11);

        Farmer farmer = new Farmer();
        farmer.setName("farmer");
        farmer.setAge(31);
        farmer.setFarm_name("little candy");

        Session s = HibernateUtil.getSession();
        Transaction tx = s.beginTransaction();
        s.save(p);
        s.save(worker);
        s.save(farmer);
        tx.commit();
    }
 
実行エラー: org.hibernate.DupliccateMappingException:duplicate import:Person refers to both hibernane.exted.Person and hibernaetest 01.Person(try using aut-mport=「false」)検査をしたところ、hibernatec.ftxml.1が使用したことがあります。mapping resource=「hibernaetest 01/person.hbm.xml」/><mapping resource=「hibernate/exted/person.hbm.xml」/異常も繰り返しマッピングしているということを示しています。そして、aut-import属性を使うように注意してください。マッピングファイルを変更:<?xml version=「1.0」encoding=「UTF-8」?DOCTYPE hibernate-mapping PUBLIC"-/Hibernate/Hibernate Mapping DT 3.0/EN"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"<                                                                が修正され、問題が解決されました。以上のプログラムコードを実行して、表示されるsql文は以下の通りです。
書き記す
ハイバーナ:insert into person(name,age,type)values(?,0)
ハイバーナ:insert into person(name,age,work year,type)values(?,?,1)
ハイバーナ:insert into person(name,age,farm uname,type)values(?,?,2)
 
データベースの表の構造を調べます。+----------------------------------------------------------------------------------------------------------------------------------------------------   | type name  | メッセージ  | ワークyear 124 farm_name+----------------------------------------------------------------------------------------------------------------------------------------------------------  1   |    0  | person   22|      NULL      | NULL         | |  2   |    1  | ウォーカー   30|        11        | NULL         | |  3   |    2  | farmer  |   31|      NULL      | little candy+---------------------------------------------------------+は上から見られます:work_yearとfarm_name属性はnullである必要があります。最初の文を挿入すると問題が発生します。これもこの方法の限界である。表に冗長フィールドがあります。構造が合理的ではない。また、クラス構造に新たなサブクラスを追加する場合は、データベーステーブルの構造を変更することも容易ではない。この方案は、クラスシステムの操作に対して一つの表に対する操作に帰結するため、性能に一定の優位があります。充:aut-mport(オプション-デフォルトはtrue):お問い合わせ言語で全限定ではないクラス名を使用できるかどうかを指定します。もし二つの持久類があるなら、それらの非フルネームは同じです。aut-mport=falseを設定してください。もしあなたが「import過ぎ」という名前を同時に二つの種類に対応すると、Hibernateは一つの異常を投げます。