转自:https://blog.csdn.net/iteye_3357/article/details/81862615

 1 可能经常遇到这样的情况:
2
3 在数据库表中会有这样的一个字段用来区别记录的属性,如:在客户表中有一个字段表示客户级别,当这个记录为A时是一级客户,为B时是二级客户。在用hiberante做OR表示时类可能是这样的:
4
5 public class Customer{
6
7 private String flag; //表示客户的级别
8
9 ...
10
11 }
12
13 然后,在程序中手动控制flag的值,但是这样当每个级的客户有不同的属性时Customer类将包含所有级别的属性,这样不是很好。
14
15 hibernate提供一个Discriminator映射的方法,就是把一个表映射成不同的类,有不同的属性。
16
17 public class Customer{
18
19 //包含所有级别的公共属性
20
21 ...
22
23 }
24
25
26
27 public class CustomerA extends Customer{
28
29 //只包括一级客户的特有属性
30
31 }
32
33 public class CustomerB extends Customer{
34
35 //只包含二级客户特有的属性
36
37 }
38
39 这样更符合面向对象的原则,然后在hbm.xml中这样写:
40
41 <id name="id" type="int">
42
43 ...
44
45 </id>
46
47 <discriminator column="flag" type="string" />
48
49 <!-- 公共属性的映射 -->
50
51 <subclass name="CustomerA" discriminator-value="A">
52
53 <!-- 一级客户特有属性的映射 -->
54
55 </subclass>
56
57 <subclass name="CustomerB" discriminator-value="B">
58
59 <!-- 二级客户特有属性的映射 -->
60
61 </subclass>
62
63 这样就可以单独的用CustomerA,CustomerB这样的实例了,做数据库修改时就不用关心flag字段的值了,会自动的加A或B。
64
65 如果是使用hibernate Annotation而不是xml来描述映谢关系,代码如下:
66
67 @Entity
68
69 @Table(name = "customer")
70
71 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
72
73 @DiscriminatorColumn(name = "flag", discriminatorType = DiscriminatorType.STRING)
74
75 public class Customer{
76
77 }
78
79 @Entity
80
81 @DiscriminatorValue(value = "A")
82
83 public class CustomerA extends Customer{
84
85 }
86
87 @Entity
88
89 @DiscriminatorValue(value = "B")
90
91 public class CustomerB extends Customer{
92
93 }
94
95 这样就可以了。

2.

 1 public class Singer {
2 private String region;
3 private Long id;
4 private Set<Song> songs = new HashSet<Song>();
5
6 public String getRegion() {
7 return region;
8 }
9
10 public void setRegion(String region) {
11 this.region = region;
12 }
13
14 public Long getId() {
15 return id;
16 }
17
18 public void setId(Long id) {
19 this.id = id;
20 }
21
22 public Set<Song> getSongs() {
23 return songs;
24 }
25
26 public void setSongs(Set<Song> songs) {
27 this.songs = songs;
28 }
29
30 public void addSong(Song song){
31 songs.add(song);
32 song.setSinger(this);
33 }
34 }

3.

 1 public class SingleSinger extends Singer {
2 private String name;
3 private char sex;
4
5 public String getName() {
6 return name;
7 }
8
9 public void setName(String name) {
10 this.name = name;
11 }
12
13 public char getSex() {
14 return sex;
15 }
16
17 public void setSex(char sex) {
18 this.sex = sex;
19 }
20 }

3.

 1 package edu.jlu.fuliang.domain;
2
3 import java.util.HashSet;
4 import java.util.Set;
5
6 public class CompositeSinger extends Singer {
7 private Set<SingleSinger> singleSingers = new HashSet<SingleSinger>();
8
9 public Set<SingleSinger> getSingleSingers() {
10 return singleSingers;
11 }
12
13 public void setSingleSingers(Set<SingleSinger> singleSingers) {
14 this.singleSingers = singleSingers;
15 }
16 public void addSinger(SingleSinger singleSinger){
17 singleSingers.add(singleSinger);
18 }
19 }

5.

 1 public class Band extends CompositeSinger {
2 private String name;
3
4 public String getName() {
5 return name;
6 }
7
8 public void setName(String name) {
9 this.name = name;
10 }
11 }

6.

 1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
4
5 <hibernate-mapping package="edu.jlu.fuliang.domain">
6 <class name="Singer" table="SINGER">
7 <id name="id" type="java.lang.Long">
8 <column name="SINGER_ID"/>
9 <generator class="identity"/>
10 </id>
11
12 <discriminator column="TYPE" type="string"/>
13
14 <property name="region" type="java.lang.String">
15 <column name="REGION"/>
16 </property>
17
18 <set name="songs" table="SONG" inverse="true" cascade="save-update">
19 <key column="SINGER_ID"/>
20 <one-to-many class="Song"/>
21 </set>
22
23 <subclass name="SingleSinger" discriminator-value="1">
24 <property name="name" type="java.lang.String">
25 <column name="NAME"/>
26 </property>
27 <property name="sex" type="java.lang.Character">
28 <column name="SEX"/>
29 </property>
30 </subclass>
31
32 <subclass name="CompositeSinger" discriminator-value="2">
33 <set name="singleSingers" table="SINGER" cascade="save-update" lazy="false">
34 <key column="COMPSITESINGER_ID"/>
35 <one-to-many class="SingleSinger"/>
36 </set>
37 </subclass>
38
39 <subclass name="Band" discriminator-value="3">
40 <set name="singleSingers" table="SINGER" cascade="save-update">
41 <key column="BAND_ID"/>
42 <one-to-many class="SingleSinger"/>
43 </set>
44 </subclass>
45 </class>
46 </hibernate-mapping>

Hibernate"discriminator-value"用法的更多相关文章

  1. 5 -- Hibernate的基本用法 -- 要点

    Hibernate的基本用法 ⊙ ORM的基本知识 ⊙ ORM和Hibernate的关系 ⊙ Hibernate的基本映射思想 ⊙ Hibernate入门知识 ⊙ 使用Eclipse开发Hiberna ...

  2. Hibernate 注解的用法以及说明(二)

    注解映射必须满足两大条件:Hibernate3.2以上版本和JSEE 5. @Entity 类注释,所有要持久化的类都要有@Entity   public class Org  implements ...

  3. Hibernate的Criteria用法

    在hibernate的Session里面使用createCriteria可以创建一个Criteria实例帮助我们进行条件查询,不用自己串hql语句,很方便. 用法很简单,首先传Class实例创建Cri ...

  4. Hibernate的 Restrictions用法

    方法说明 方法 说明 Restrictions.eq = Restrictions.allEq 利用Map来进行多个等于的限制 Restrictions.gt > Restrictions.ge ...

  5. Hibernate 注解的用法以及说明

    1.类级别注解 @Entity     映射实体类 @Table    映射数句库表  @Entity(name="tableName") - 必须,注解将一个类声明为一个实体be ...

  6. Hibernate.initialize(Obj)用法

    导读:  在使用hibernate进行持久化时,有时需要动态的改变对象的加载,比如在编辑页面里面lazy=true,而在浏览页面lazy=false,这样可以在需要lazy的地方才进行控制.而配置文件 ...

  7. Hibernate核心类用法-使用Transaction管理事务

    一个典型的事务应该使用下面的形式 在创建完Session对象后即使用beginTransaction()启动事务 从此开始直到commit()之间的代码 都会处于同一个事务中 这两个函数之间所有的数据 ...

  8. hibernate的like用法(用占位符解决)

    原本我的写法:Query repeatClientQuery=querysession.createQuery("from ClientInfo as a " +"whe ...

  9. Hibernate的Restrictions用法

    Restrictions.eq --> equal,等于. Restrictions.allEq --> 参数为Map对象,使用key/value进行多个等于的比对,相当于多个Restri ...

  10. 轻量级Java_EE企业应用实战-第5章Hibernate的基本用法-001

    1. package org.crazyit.app.domain; import javax.persistence.*; /** * Description: <br/> * ��վ: ...

随机推荐

  1. Android UI开发第四十三篇——使用Property Animation实现墨迹天气3.0引导界面及动画实现

    前面写过<墨迹天气3.0引导界面及动画实现>,里面完美实现了动画效果,那一篇文章使用的View Animation,这一篇文章使用的Property Animation实现.Propert ...

  2. python 基础 9.2 mysql 事务

    一. mysql 事务    MySQL 事务主要用于处理操作量大,复杂度高的数据.比如,你操作一个数据库,公司的一个员工离职了,你要在数据库中删除它的资料,也要删除该人员相关的,比如邮箱,个人资产等 ...

  3. python 基础 3.2 文件 for 练习

    #/usr/bin/python #coding=utf-8 #@Time   :2017/11/1 22:19 #@Auther :liuzhenchuan #@File   :1030-1031练 ...

  4. 九度OJ 1063:整数和 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3456 解决:2254 题目描述: 编写程序,读入一个整数N. 若N为非负数,则计算N到2N之间的整数和: 若N为一个负数,则求2N到N之间 ...

  5. StackOver上的一个wx刷新显示的例子

    import wx class MyFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None) self.panel = wx ...

  6. JSP中的内容布局

    参考 :https://stackoverflow.com/questions/10529963/what-is-the-best-way-to-create-jsp-layout-template ...

  7. (转)php 根据url自动生成缩略图并处理高并发问题

    分享是一种精神,与技术高低无关!   图片缩略图动态生成- [代码编程] 2011-08-23 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://www.blogbus.c ...

  8. 销售订单增强字段 bapi更新

    如果增强字段在销售订单抬头(vbak)上,则要将增强字段一并append到如下四个表/结构中: VBAKKOZ VBAKKOZX BAPE_VBAK BAPE_VBAKX 在行项目(vbap)上: V ...

  9. (转)JavaScript中==和===的区别

    ==   用于比较   判断 两者相等      ==在比较的时候可以转自动换数据类型 ===用于严格比较   判断两者严格相等     ===严格比较,不会进行自动转换,要求进行比较的操作数必须类型 ...

  10. selenium 页面超时后捕获异常也无法继续get(url)使用的问题解决方案

    参考这篇博客 http://www.xiaomilu.top/archives/106