Extend继承关系
前面文档已经提到过映射继承的方式,在这里看一个简单的例子。这里使用Product(货品)和BookProduct(图书)的例子来演示继承关系。对象设计如下:
//货品对象
public class Product {
private Long id;
private String name;
//getter & setter
}
//图书货品对象
public class BookProduct extends Product {
private String isbn;
//getter & setter
}
学了hibernate就知道,继承关系可以有三种方式来完成数据库表的映射。 第一:One Table,即基类及其所有的子类的所有属性都放到一张表里面。使用一个额外的列来标记当前行保存的对象实例的类型。 第二:Join Table,即基类放到一张表里面,所有的子类都放到各自单独的表里面,使用子表的主键作为外键关联到基类表的主键。 第三:Per Table,即所有的子类,及子类继承的父类的所有的属性都放到各自的表中。在这种情况下需要注意的一点就是ID的生成策略不能使用数据库自动增强的列。 在这里,就使用第一种方式来完成继承的示例。注意,如果使用的是第二种或第三种方式,在完成多态查询的时候,必须要使用Join或者Union完成表的联合查询。 另外,继承关系我们采用hibernate的映射方式,把整个集成体系的所有类的映射都放到一个映射文件中。 映射文件:<mapper namespace="cd.itcast.mybatis.extend.ProductMapper"> <!-- 保存货品对象(基类类型),注意,在这里面我觉得最好各自类型创建对应的SQL --> <insert id="saveProduct" keyProperty="id" parameterType="Product" useGeneratedKeys="true"> INSERT INTO product(name,types) VALUES (#{name},1) </insert> <!-- 保存图书货品对象,注意类型列的值是固定的 --> <insert id="saveBookProduct" keyColumn="id" keyProperty="id" useGeneratedKeys="true" parameterType="BookProduct"> INSERT INTO product(name,isbn,types) VALUES (#{name},#{isbn},2) </insert> <!-- 映射类型,采用内联的继承映射方式 --> <resultMap type="Product" id="productmap"> <id column="id" property="id"/> <result column="name" property="name"/> <!-- 定义鉴别器,根据不同的type映射不同的对象类型实例 --> <discriminator javaType="int" column="types"> <case value="1" resultType="Product"/> <case value="2" resultType="BookProduct"> <result column="isbn" property="isbn"/> </case> </discriminator> </resultMap> <select id="get" parameterType="long" resultMap="productmap"> SELECT * FROM product WHERE id = #{id} </select> <select id="list" resultMap="productmap"> SELECT * FROM product </select> <!-- 删除直接删除类型即可 --> <delete id="delete" parameterType="long"> DELETE FROM product WHERE id = #{id} </delete> </mapper>
映射文件还是非常简单明了的,最后,为该映射文件创建对应的Mapper接口,即可:public interface ProductMapper { void saveProduct(Product p); void saveBookProduct(BookProduct bp); Product get(Long id); List list(RowBounds rb); void delete(Long id); }