employee:
两个子类:Skiller Sales
一张表:增加一个type字段
type skill sell
skill,sell字段得允许为空
鉴别器:
<hibernate-mapping package="com.ethan.domain">
<class name="Employee" discriminator-value="0">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="tyep" type="java.lang.Integer"></discriminator>
<!-- name unique -->
<property name="name"/>
<!-- departId外键参考department表 -->
<many-to-one name="depart" column="departId"/>
<subclass name="Skiller" discriminator-value="1">
<property name="skill"></property>
</subclass>
<subclass name="Sales" discriminator-value="2">
<property name="sell"></property>
</subclass>
</class>
</hibernate-mapping>
查询语句:只牵扯到一张表
Hibernate:
select
employee0_.id as id0_0_,
employee0_.name as name0_0_,
employee0_.departId as departId0_0_,
employee0_.skill as skill0_0_,
employee0_.sell as sell0_0_,
employee0_.tyep as tyep0_0_
from
Employee employee0_
where
employee0_.id=?
class com.ethan.domain.Skiller
Employee emp = (Employee) s.get(Skiller.class, empId);
from
Employee skiller0_
where
skiller0_.id=?
and skiller0_.tyep=1
如果增加子类,就得改变表结构,有些字段不能为非空
2.把公共字段放在一张表,特有字段放在各自的表中,加外键
每个子类一张表,子类属性差异比较大,不太注重效率
joined-subclass:
<joined-subclass name="Skiller" table="skiller">
<key column="emp_id"/><!-- 引用的是id -->
<property name="skill"></property>
</joined-subclass>
<joined-subclass name="Sales" table="sales">
<key column="emp_id"/><!-- 引用的是id -->
<property name="sell"></property>
</joined-subclass>
employee pk id sales pk,fk employee_id
sell
name
depart_id
查询会用到多张表
id,没有逻辑意义,不用担心修改问题
下边会查三张表,效率上不高
Employee emp = (Employee) s.get(Employee.class, empId);
from
Employee employee0_
left outer join
skiller employee0_1_
on employee0_.id=employee0_1_.emp_id
left outer join
sales employee0_2_
on employee0_.id=employee0_2_.emp_id
where
employee0_.id=?
两个子类:Skiller Sales
一张表:增加一个type字段
type skill sell
skill,sell字段得允许为空
鉴别器:
<hibernate-mapping package="com.ethan.domain">
<class name="Employee" discriminator-value="0">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="tyep" type="java.lang.Integer"></discriminator>
<!-- name unique -->
<property name="name"/>
<!-- departId外键参考department表 -->
<many-to-one name="depart" column="departId"/>
<subclass name="Skiller" discriminator-value="1">
<property name="skill"></property>
</subclass>
<subclass name="Sales" discriminator-value="2">
<property name="sell"></property>
</subclass>
</class>
</hibernate-mapping>
查询语句:只牵扯到一张表
Hibernate:
select
employee0_.id as id0_0_,
employee0_.name as name0_0_,
employee0_.departId as departId0_0_,
employee0_.skill as skill0_0_,
employee0_.sell as sell0_0_,
employee0_.tyep as tyep0_0_
from
Employee employee0_
where
employee0_.id=?
class com.ethan.domain.Skiller
Employee emp = (Employee) s.get(Skiller.class, empId);
from
Employee skiller0_
where
skiller0_.id=?
and skiller0_.tyep=1
如果增加子类,就得改变表结构,有些字段不能为非空
2.把公共字段放在一张表,特有字段放在各自的表中,加外键
每个子类一张表,子类属性差异比较大,不太注重效率
joined-subclass:
<joined-subclass name="Skiller" table="skiller">
<key column="emp_id"/><!-- 引用的是id -->
<property name="skill"></property>
</joined-subclass>
<joined-subclass name="Sales" table="sales">
<key column="emp_id"/><!-- 引用的是id -->
<property name="sell"></property>
</joined-subclass>
employee pk id sales pk,fk employee_id
sell
name
depart_id
查询会用到多张表
id,没有逻辑意义,不用担心修改问题
下边会查三张表,效率上不高
Employee emp = (Employee) s.get(Employee.class, empId);
from
Employee employee0_
left outer join
skiller employee0_1_
on employee0_.id=employee0_1_.emp_id
left outer join
sales employee0_2_
on employee0_.id=employee0_2_.emp_id
where
employee0_.id=?