Hibernate的继承映射

使用继承映射的前提是,项目不先设计数据库,而是先设计pojo类,再根据pojo生成数据库表,同时pojo中必须出现继承关系。

这里按照这种继承关系设计以下几个类:

1)  父类:Person,建议使用抽象类

a)         属性

                        i.             Id

                       ii.             Name

                     iii.             age

2)  子类:

a)         Student

                        i.             School

                       ii.             score

b)        Worker

                        i.             sal

 

根据以上的类,需要设计表结构:

1)  三张表:

a)         Person表

                        i.             字段

1.         Id,主键

2.         Name

3.         age

b)        Student表

                        i.             字段

1.         Id,主键,外键

2.         School

3.         score

c)         Worker表

                        i.             字段

1.         Id:主键,外键

2.         Sal

d)        优点:标准范式,容易扩展

e)         缺点:代码实现难度大,多表关联操作过多。

2)  两张表:

a)         Student

                        i.             Id

                       ii.             Name

                     iii.             Age

                     iv.             School

                       v.             score

b)        Worker

                        i.             Id

                       ii.             Name

                     iii.             Age

                     iv.             Sal

c)         优点:代码相对简单,相对容易扩展

d)        缺点:完全没有体现继承关系,查询所有数据比较麻烦

3)  一张表

a)         Person

                        i.             Id

                       ii.             Name

                     iii.             Age

                     iv.             School

                       v.             Score

                     vi.             Sal

                    vii.             Type

b)        优点:代码最简单

c)         缺点:不容易扩展和维护。

 

在这里使用Hibernate实现三张表和一张表的设计。

先建立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/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>

        <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中:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">


<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>


<session-factory>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:ORCL
</property>
<property name="connection.username">sunxun</property>
<property name="connection.password">123</property>
<property name="connection.driver_class">
oracle.jdbc.OracleDriver
</property>
<property name="myeclipse.connection.profile">oracle</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping resource="org/liky/pojo/Person.hbm.xml" />


</session-factory>


</hibernate-configuration>

加入后,可以编写一个生成数据库表的操作:

public class DataBaseUtils {

 

    public static void createTable() {

        SchemaExport export = new SchemaExport(HibernateSessionFactory

                .getConfiguration());

 

        export.create(true, true);

    }

 

    public static void dropTable() {

        SchemaExport export = new SchemaExport(HibernateSessionFactory

                .getConfiguration());

 

        export.drop(true, true);

    }

 

    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、付费专栏及课程。

余额充值