Hibernate"discriminator-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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM