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

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

2.

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

3.

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

3.

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

5.

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

6.

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

    解决循环import的方法主要有几种:   1.延迟导入(lazy import)   即把import语句写在方法或函数里面,将它的作用域限制在局部. 这种方法的缺点就是会有性能问题.     2. ...

  2. 九度OJ 1055:数组逆置 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7324 解决:3429 题目描述: 输入一个字符串,长度小于等于200,然后将数组逆置输出. 输入: 测试数据有多组,每组输入一个字符串. ...

  3. NotePad++ 正则表达式替换

    NotePad++ 正则表达式替换 高级用法 [转] - aj117 - 博客园 https://www.cnblogs.com/tibit/p/6387199.html const getQAPar ...

  4. Complete space 完备空间与柯西序列 巴拿赫空间与完备空间 完备空间与和希尔伯特空间 封闭closed与完备性complete

    http://www.gatsby.ucl.ac.uk/~gretton/coursefiles/RKHS2013_slides1.pdf RKHS: a function space with a ...

  5. 解决win7打印机共享出现“无法保存打印机设置(错误0x000006d9)的问题

    最新解决win7打印机共享出现“无法保存打印机设置(错误0x000006d9)的问题,由系统下载吧率先分享: 有些用户在使用Windows7系统过程中,碰到到win7打印机共享出现“无法保存打印机设置 ...

  6. SAP-财务会计

    [转自 http://blog.itpub.net/195776/viewspace-1023913/] 一.FI组织架构1主数据1.1总帐科目1.2帐户组.1.3统驭科目1.4 总帐未清项管理2 凭 ...

  7. 扫盲-wpf依赖属性

    一.什么是依赖属性 依赖属性就是一种自己可以没有值,并且可以通过绑定从其他数据源获取值.依赖属性可支持WPF中的样式设置.数据绑定.继承.动画及默认值. 将所有的属性都设置为依赖属性并不总是正确的解决 ...

  8. View 视图动画基础

  9. hdu 2015校赛1002 Dual horsetail (思维题 )

    Dual horsetail Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  10. joomla搬家之后打不开 首页404错误

    joomla 安装好之后, 网站打不开,首页404错误,后台能够正常访问,数据库连接正常.应该是 nginx配置的问题.该如何修改配置呢?随便一个链接点进去都是404,找不到页面,URL的形式如下: ...