您的位置:首页 > 其它

Hibernate的继承映射

2014-03-19 23:33 267 查看
使用继承映射的前提是,项目不先设计数据库,而是先设计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>
 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate 继承映射