Hibernate继承映射:每个子类一张表(joined-subclass)表结构
2008-11-13 13:29
513 查看
我在前面写了关于继承映射的整个继承树对应一张表的例子,但是他存在以一定的弊端。在数据表中会产生大量的null值。
为了避免这种情况的发生。我们可以这样去做:
<joined-subclass name="Skiller" table="skiller">
<key column="emp_id"/>
<property name="skill"></property>
</joined-subclass>
<joined-subclass name="Sales" table="sales">
<key column="emp_id"/>
<property name="sell"></property>
</joined-subclass>
通过使用joined-subclass映射,对每一个子类生成一张表。
1、domain类:
package com.zhaosoft.domain;
public class Employee {
private int id;
private String name;
private Department depart;
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 Department getDepart() {
return depart;
}
public void setDepart(Department depart) {
this.depart = depart;
}
}
2、各个子类:
package com.zhaosoft.domain;
public class Sales extends Employee{
private int sell;//销售额
public int getSell() {
return sell;
}
public void setSell(int sell) {
this.sell = sell;
}
}
---------------------------------------------
package com.zhaosoft.domain;
public class Skiller extends Employee{
private String skill;
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
}
3、映射文件:
<?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 package="com.zhaosoft.domain">
<!-- 当discriminator-value值为0时,为普通员工 -->
<class name="Employee" discriminator-value="0">
<id name="id">
<!-- 表示主键为自动增长 -->
<generator class="native"/>
</id>
<property name="name" type="string"/>
<many-to-one name="depart" class="Department" column="depart_id"></many-to-one>
<joined-subclass name="Skiller" table="skiller">
<key column="emp_id"/>
<property name="skill"></property>
</joined-subclass>
<joined-subclass name="Sales" table="sales">
<key column="emp_id"/>
<property name="sell"></property>
</joined-subclass>
</class>
</hibernate-mapping>
4、测试文件:
public static void add() {
Session s = null;
Transaction t=null;
try {
s=HibernateUtil.getSession();
t = s.beginTransaction();
t.begin();
Department d = new Department();
d.setName("销售部");
Employee employee1 = new Employee();
employee1.setName("小三");
employee1.setDepart(d);
Skiller employee2 = new Skiller();
employee2.setName("李斯");
employee2.setSkill("skill");
employee2.setDepart(d);
Sales employee3 = new Sales();
employee3.setName("王五");
employee3.setSell(100);
employee3.setDepart(d);
Set<Employee> set=new HashSet<Employee>();
set.add(employee1);
set.add(employee2);
set.add(employee3);
d.setEmps(set);
s.save(d);
s.save(employee1);
s.save(employee2);
s.save(employee3);
t.commit();
} catch (Exception e) {
} finally {
if (s != null) {
s.close();
}
}
}
为了避免这种情况的发生。我们可以这样去做:
<joined-subclass name="Skiller" table="skiller">
<key column="emp_id"/>
<property name="skill"></property>
</joined-subclass>
<joined-subclass name="Sales" table="sales">
<key column="emp_id"/>
<property name="sell"></property>
</joined-subclass>
通过使用joined-subclass映射,对每一个子类生成一张表。
1、domain类:
package com.zhaosoft.domain;
public class Employee {
private int id;
private String name;
private Department depart;
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 Department getDepart() {
return depart;
}
public void setDepart(Department depart) {
this.depart = depart;
}
}
2、各个子类:
package com.zhaosoft.domain;
public class Sales extends Employee{
private int sell;//销售额
public int getSell() {
return sell;
}
public void setSell(int sell) {
this.sell = sell;
}
}
---------------------------------------------
package com.zhaosoft.domain;
public class Skiller extends Employee{
private String skill;
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
}
3、映射文件:
<?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 package="com.zhaosoft.domain">
<!-- 当discriminator-value值为0时,为普通员工 -->
<class name="Employee" discriminator-value="0">
<id name="id">
<!-- 表示主键为自动增长 -->
<generator class="native"/>
</id>
<property name="name" type="string"/>
<many-to-one name="depart" class="Department" column="depart_id"></many-to-one>
<joined-subclass name="Skiller" table="skiller">
<key column="emp_id"/>
<property name="skill"></property>
</joined-subclass>
<joined-subclass name="Sales" table="sales">
<key column="emp_id"/>
<property name="sell"></property>
</joined-subclass>
</class>
</hibernate-mapping>
4、测试文件:
public static void add() {
Session s = null;
Transaction t=null;
try {
s=HibernateUtil.getSession();
t = s.beginTransaction();
t.begin();
Department d = new Department();
d.setName("销售部");
Employee employee1 = new Employee();
employee1.setName("小三");
employee1.setDepart(d);
Skiller employee2 = new Skiller();
employee2.setName("李斯");
employee2.setSkill("skill");
employee2.setDepart(d);
Sales employee3 = new Sales();
employee3.setName("王五");
employee3.setSell(100);
employee3.setDepart(d);
Set<Employee> set=new HashSet<Employee>();
set.add(employee1);
set.add(employee2);
set.add(employee3);
d.setEmps(set);
s.save(d);
s.save(employee1);
s.save(employee2);
s.save(employee3);
t.commit();
} catch (Exception e) {
} finally {
if (s != null) {
s.close();
}
}
}
相关文章推荐
- Hibernate继承映射:每个子类一张表(joined-subclass)表结构
- hibernate继承映射之每个子类一张表(无辨识)
- Hibernate基础------》映射关系---》继承映射-》join_subclass映射(每个类对应一张表)
- Hibernate学习笔记:继承映射之每个类继承结构一张表
- Hibernate映射类继承之每个带有隐式多态的具体类一张表(每个子类各一张表,有各自的映射文件)
- hibernate继承映射策略之每个子类一张表
- Hibernate继承映射方式之每个子类一张表
- Hibernate学习笔记:继承映射之每个子类一张表
- Hibernate学习笔记:继承映射之每个子类一张表,使用辨别标志
- Hibernate映射类继承之每个带有联合的具体类一张表(每个子类各一张表,共用一个父类映射文件)
- hibernate继承关系映射关系方法(二)--每个子类一张表
- Hibernate学习笔记:混合使用每个继承结构一张表 和 每个子类一张表
- Hibernate映射类继承之每个类层次结构一张表(父子类共用一张表,一个映射文件)
- hibernate继承映射之每个分层结构一张表
- Hibernate_映射_继承结构映射1_使用一张表的方式
- hibernate继承映射之每个具体类一张表
- Hibernate学习18 -- 关联映射8 -- 继承映射2 -- 父类存储在一张表,子类分别存储一张表
- Hibernate继承映射之每个类一张表
- 十三、实体继承映射(每个子类映射成一张表)
- Hibernate 继承映射实现方式之每个具体类对应一张表