Hibernate继承映射(反向映射到数据库) SchemaExport ,存在继承关系,从pojo文件映射出数据库文件

先建立pojo类。

public abstract class Person {

 

    private String id;

    private String name;

    private Integer age;

}

public class Student extends Person {

 

    private String school;

     private Double  score;

}

public class Worker extends Person {

 

     private Double  sal;

}

手工编写Person的映射文件。先完成三张表形式的映射。

<?xml version="1.0"encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/HibernateMapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="org.liky.pojo.Person" table="PERSON" schema="SUNXUN">

       <id name="id"type="java.lang.String">

           <column name="id"length="18" />

           <generator class="assigned"/>

       </id>

       <property name="name"type="java.lang.String">

           <column name="name"length="20" not-null="true"/>

       </property>

       <property name="age"type="java.lang.Integer">

           <column name="age"precision="3" not-null="true"/>

</property>

 

       <joined-subclass name="org.liky.pojo.Student"table="STUDENT"

           schema="SUNXUN">

           <key>

              <column name="id"></column>

           </key>

           <property name="school"type="java.lang.String">

              <column name="SCHOOL"length="100"></column>

           </property>

           <property name="score"type="java.lang.Double">

              <column name="score"precision="5" scale="2"></column>

           </property>

       </joined-subclass>

 

       <joined-subclass name="org.liky.pojo.Worker"table="WORKER"

           schema="SUNXUN">

           <key>

              <column name="id"></column>

           </key>

           <property name="sal"type="java.lang.Double">

              <column name="SAL"precision="8" scale="2"></column>

           </property>

       </joined-subclass>

 

    </class>

 

</ hibernate-mapping >


注意,外键使用 <key> 来表示

将该映射文件配置到hibernate.cfg.xml中(和自动生成映射的格式一样)。加入后,可以编写一个生成数据库表的操作。


public class DataBaseUtils {

 

    public static void createTable() {

       SchemaExport export = new SchemaExport(HibernateSessionFactory

              .getConfiguration());

 

       export.create(truetrue);

    }

 

    public static void dropTable() {

       SchemaExport export = new SchemaExport(HibernateSessionFactory

              .getConfiguration());

 

export.drop(truetrue);

    }

 

    public static void main(String[] args) {

       createTable();

    }

 

}

编写数据库操作时,只需要写Person的操作即可


public static void main(String[] args) {

       // Student s = new Student();

       // s.setId("123");

       // s.setName("张三");

       // s.setAge(23);

       // s.setSchool("北航");

       // s.setScore(60.0);

 

       // Worker w = new Worker();

       // w.setId("abc");

       // w.setName("李四");

       // w.setAge(33);

       // w.setSal(10000.0);

       //

       // Transaction tx =HibernateSessionFactory.getSession()

       // .beginTransaction();

       //HibernateSessionFactory.getSession().save(w);

       //

       // tx.commit();

 

       String hql = "FROM Person";

       System.out.println(HibernateSessionFactory.getSession()

              .createQuery(hql).list());

 

       HibernateSessionFactory.closeSession();

 

    }

}


如果只使用一张表,只需要修改映射文件即可,程序代码完全不需要修改。三表融合
<?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>
<class name="org.liky.pojo.Person" table="PERSON" schema="SUNXUN">
<id name="id" type="java.lang.String">
<column name="id" length="18" />
<generator class="assigned" />
</id>
<!-- 
声明一个标志位,用来标识该类到底是哪种分类
-->
<discriminator type="string">
<column name="type" length="10"></column>
</discriminator>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" precision="3" not-null="true" />
</property>


<!-- 
加入单表形式的子类
-->
<subclass name="org.liky.pojo.Student" discriminator-value="学生">
<property name="school" type="java.lang.String">
<column name="SCHOOL" length="100"></column>
</property>
<property name="score" type="java.lang.Double">
<column name="score" precision="5" scale="2"></column>
</property>
</subclass>


<subclass name="org.liky.pojo.Worker" discriminator-value="工人">
<property name="sal" type="java.lang.Double">
<column name="SAL" precision="8" scale="2"></column>
</property>
</subclass>




</class>


</hibernate-mapping>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值