Hibernatediscriminator-value用法
转自: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用法相关推荐
- c语言中external,static关键字用法
static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...
- Pandas_transform的用法
先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...
- Python中yield和yield from的用法
yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...
- pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法
squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...
- python yield 和 yield from用法总结
#例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...
- tf.nn.embedding_lookup()的用法
函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...
- OpenMP用法大全
OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...
- Dorado用法与示例
Dorado用法与示例 dorado用后总结 一.dorado概念 dorado的产品全名是"dorado展现中间件".从产品形态上dorado由两部分组成,第一部分是一个具有AJ ...
- TensorFlow用法
TensorFlow用法 什么是TensorFlow TensorFlow是一个开源软件库,用于使用数据流图进行数值计算.图中的节点表示数学运算,而图的边缘表示流动的多维数据数组(张量).这种灵活的体 ...
- TensorFlow Keras API用法
TensorFlow Keras API用法 Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,可以编译和拟 ...
最新文章
- Git之hotfix热修复分支
- 函数作用域,闭包,数据类型的题目
- SAP BC417 课程中文自学笔记
- socket php验证客户端验证,用Socket发送电子邮件(利用需要验证的SMTP服务器)_php基础...
- Partitioning Strategies
- 栈和队列之设计一个有getMin(得到最小值)功能的栈
- Windows平台基于RTMP实现一对一互动直播
- 上汽通用五菱与菜鸟合作数字供应链 一期整车数字物流系统正式启用
- 云数据库时代已来,程序员该如何出击?
- 暑期OI大电影——不看后悔整个OI生涯!
- 关于·nowrap与width
- 《那些年啊,那些事——一个程序员的奋斗史》——06
- Android打造自定义通用popWindow
- 对PBFT算法的理解
- u盘容量足够,但是提示目标文件过大无法复制的解决办法
- 修复DialogFragment Fragment already added 异常
- Flutter 日期转换
- Java+spring+vue基于ssm的农家乐预定管理系统
- 什么是编程?什么是编程语言?
- 术业有专攻,数据库的 dba
热门文章
- netty socket超时设置_Netty 学习和进阶策略
- mysql5.7配置_MySQL5.7详细配置教程
- 计算机的主要危害是什么意思,cpu使用率是什么意思 cpu使用率低但是电脑卡原因...
- 一级计算机综合训练第五卷,2018职称计算机考试基础综合练习及答案(5)
- python数据怎么用不了_为什么自学Python看不进去?
- Eigen有哪些需要注意的操作
- 教育谋定应用型高校 经济和信息化研究共建成都工业学院
- 新疆兵团谋定丰收美景-万祥军:对话农民丰收节交易会
- axios捕获401 赋值token
- 2016级算法期末模拟练习赛-A.wuli51和京导的毕业旅行