转自: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>

转载于:https://www.cnblogs.com/sharpest/p/6209674.html

Hibernatediscriminator-value用法相关推荐

  1. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  2. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

  3. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  4. pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

  5. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...

  6. tf.nn.embedding_lookup()的用法

    函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...

  7. OpenMP用法大全

    OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...

  8. Dorado用法与示例

    Dorado用法与示例 dorado用后总结 一.dorado概念 dorado的产品全名是"dorado展现中间件".从产品形态上dorado由两部分组成,第一部分是一个具有AJ ...

  9. TensorFlow用法

    TensorFlow用法 什么是TensorFlow TensorFlow是一个开源软件库,用于使用数据流图进行数值计算.图中的节点表示数学运算,而图的边缘表示流动的多维数据数组(张量).这种灵活的体 ...

  10. TensorFlow Keras API用法

    TensorFlow Keras API用法 Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,可以编译和拟 ...

最新文章

  1. Git之hotfix热修复分支
  2. 函数作用域,闭包,数据类型的题目
  3. SAP BC417 课程中文自学笔记
  4. socket php验证客户端验证,用Socket发送电子邮件(利用需要验证的SMTP服务器)_php基础...
  5. Partitioning Strategies
  6. 栈和队列之设计一个有getMin(得到最小值)功能的栈
  7. Windows平台基于RTMP实现一对一互动直播
  8. 上汽通用五菱与菜鸟合作数字供应链 一期整车数字物流系统正式启用
  9. 云数据库时代已来,程序员该如何出击?
  10. 暑期OI大电影——不看后悔整个OI生涯!
  11. 关于·nowrap与width
  12. 《那些年啊,那些事——一个程序员的奋斗史》——06
  13. Android打造自定义通用popWindow
  14. 对PBFT算法的理解
  15. u盘容量足够,但是提示目标文件过大无法复制的解决办法
  16. 修复DialogFragment Fragment already added 异常
  17. Flutter 日期转换
  18. Java+spring+vue基于ssm的农家乐预定管理系统
  19. 什么是编程?什么是编程语言?
  20. 术业有专攻,数据库的 dba

热门文章

  1. netty socket超时设置_Netty 学习和进阶策略
  2. mysql5.7配置_MySQL5.7详细配置教程
  3. 计算机的主要危害是什么意思,cpu使用率是什么意思 cpu使用率低但是电脑卡原因...
  4. 一级计算机综合训练第五卷,2018职称计算机考试基础综合练习及答案(5)
  5. python数据怎么用不了_为什么自学Python看不进去?
  6. Eigen有哪些需要注意的操作
  7. 教育谋定应用型高校 经济和信息化研究共建成都工业学院
  8. 新疆兵团谋定丰收美景-万祥军:对话农民丰收节交易会
  9. axios捕获401 赋值token
  10. 2016级算法期末模拟练习赛-A.wuli51和京导的毕业旅行