hiberate繼承分為三種方式:一個(gè)表對(duì)應(yīng)所有繼承的類(lèi),具體類(lèi)對(duì)應(yīng)一個(gè)表,一個(gè)類(lèi)對(duì)應(yīng)一個(gè)表(父類(lèi)及子類(lèi))
一個(gè)類(lèi)對(duì)應(yīng)一個(gè)表(父類(lèi)及子類(lèi))
數(shù)據(jù)庫(kù)腳本
CREATE TABLE `t_item1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`manufacture` varchar(20) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC

CREATE TABLE `t_book1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`manufacture` varchar(20) DEFAULT NULL,
`pagecount` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC COMMENT='InnoDB free: 3072 kB'

CREATE TABLE `t_dvd1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`manufacture` varchar(20) DEFAULT NULL,
`regioncode` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC

類(lèi)代碼

public class TItem1 implements Serializable
{
private int id;
private String name;
private String manufacture;


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;
}


public String getManufacture()
{
return manufacture;
}


public void setManufacture(String manufacture)
{
this.manufacture = manufacture;
}

}



public class TBook1 extends TItem1 implements Serializable
{
private int pagecount;


public int getPagecount()
{
return pagecount;
}


public void setPagecount(int pagecount)
{
this.pagecount = pagecount;
}

}


public class TDvd1 extends TItem1 implements Serializable
{
private String regioncode;


public String getRegioncode()
{
return regioncode;
}


public void setRegioncode(String regioncode)
{
this.regioncode = regioncode;
}

}

配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="mypackage.TItem1" table="t_item1">
<id name="id" column="id">
<generator class="identity"/>
</id>
<property name="name" column="name"/>
<property name="manufacture" column="manufacture"/>
<joined-subclass name="mypackage.TBook1" table="t_book1">
<key column="id"/>
<property name="pagecount" column="pagecount" type="java.lang.Integer"/>
</joined-subclass>
<joined-subclass name="mypackage.TDvd1" table="t_dvd1">
<key column="id"/>
<property name="regioncode" column="regioncode" type="java.lang.String"/>
</joined-subclass>
</class>
</hibernate-mapping>
具體類(lèi)對(duì)應(yīng)一個(gè)表
數(shù)據(jù)庫(kù)腳本
CREATE TABLE `t_book2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`manufacture` varchar(20) DEFAULT NULL,
`pagecount` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=latin1
CREATE TABLE `t_dvd2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(23) DEFAULT NULL,
`manufacture` varchar(20) DEFAULT NULL,
`regioncode` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=latin1
類(lèi)代碼

public abstract class TItem2 implements java.io.Serializable
{
private int id;
private String name;
private String manufacture;


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;
}


public String getManufacture()
{
return manufacture;
}


public void setManufacture(String manufacture)
{
this.manufacture = manufacture;
}

}



public class TDvd2 extends TItem2 implements Serializable
{
private String regioncode;


public String getRegioncode()
{
return regioncode;
}


public void setRegioncode(String regioncode)
{
this.regioncode = regioncode;
}

}


public class TBook2 extends TItem2 implements Serializable
{
private int pagecount;


public int getPagecount()
{
return pagecount;
}


public void setPagecount(int pagecount)
{
this.pagecount = pagecount;
}

}

配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="mypackage.TDvd2" table="t_dvd2">
<id name="id" column="id">
<generator class="identity"/>
</id>
<property name="name" column="name"/>
<property name="manufacture" column="manufacture"/>
<property name="regioncode" column="regioncode"/>
</class>
<class name="mypackage.TBook2" table="t_book2">
<id name="id" column="id">
<generator class="identity"/>
</id>
<property name="name" column="name"/>
<property name="manufacture" column="manufacture"/>
<property name="pagecount" column="pagecount"/>
</class>
</hibernate-mapping>
一個(gè)表對(duì)應(yīng)所有繼承的類(lèi)
數(shù)據(jù)庫(kù)腳本
CREATE TABLE `t_item3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`manufacture` varchar(20) DEFAULT NULL,
`pagecount` int(11) DEFAULT NULL,
`regioncode` varchar(20) DEFAULT NULL,
`category` varchar(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
類(lèi)代碼

public class TItem3 implements Serializable
{
private int id;
private String name;
private String manufacture;
private String category;


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;
}


public String getManufacture()
{
return manufacture;
}


public void setManufacture(String manufacture)
{
this.manufacture = manufacture;
}


public String getCategory()
{
return category;
}


public void setCategory(String category)
{
this.category = category;
}

}



public class TDvd3 extends TItem3 implements Serializable
{
private String regioncode;


public String getRegioncode()
{
return regioncode;
}


public void setRegioncode(String regioncode)
{
this.regioncode = regioncode;
}

}


public class TBook3 extends TItem3 implements Serializable
{
private int pagecount;


public int getPagecount()
{
return pagecount;
}


public void setPagecount(int pagecount)
{
this.pagecount = pagecount;
}

}

配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="mypackage.TItem3" table="t_item3">
<id name="id" column="id">
<generator class="identity"/>
</id>
<discriminator column="category" type="java.lang.String"/>
<property name="name" column="name"/>
<property name="manufacture" column="manufacture"/>
<subclass name="mypackage.TDvd3" discriminator-value="1">
<property name="regioncode" column="regioncode"/>
</subclass>
<subclass name="mypackage.TBook3" discriminator-value="0">
<property name="pagecount" column="pagecount"/>
</subclass>
</class>
</hibernate-mapping>
三種方式的優(yōu)缺點(diǎn)
每個(gè)類(lèi)對(duì)應(yīng)一個(gè)表
缺點(diǎn):創(chuàng)建表過(guò)多,查詢(xún)需用求外連接,優(yōu)點(diǎn):某個(gè)表字段發(fā)生變化只需修改相對(duì)表,支持多態(tài)查詢(xún),符合關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)
具體類(lèi)對(duì)應(yīng)一個(gè)表
缺點(diǎn):數(shù)據(jù)表包含重復(fù)字段,如果父類(lèi)發(fā)生變化子類(lèi)也要變化,查詢(xún)父類(lèi)時(shí)要查詢(xún)所有子類(lèi),不支持多態(tài)查詢(xún),優(yōu)點(diǎn):符合關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)
一個(gè)表對(duì)應(yīng)所有類(lèi)
缺點(diǎn):表中引入?yún)^(qū)分子類(lèi)的字段,子類(lèi)的字段不能創(chuàng)建為空,優(yōu)點(diǎn):只需一張表,有很好的查詢(xún)性能,只要修改一張表,支持多態(tài)查詢(xún)