Hibernate的Discriminator應用(一篇)

 可能經常遇到這樣的情況:

       在數據庫表中會有這樣的一個字段用來區別記錄的屬性,如:在客戶表中有一個字段表示客戶級別,當這個記錄爲A時是一級客戶,爲B時是二級客戶。在用hiberante做OR表示時類可能是這樣的:
       public class Customer{
          private String flag;   //表示客戶的級別
          ...
       }    
       然後,在程序中手動控制flag的值,但是這樣當每個級的客戶有不同的屬性時Customer類將包含所有級別的屬性,這樣不是很好。
       hibernate提供一個Discriminator映射的方法,就是把一個表映射成不同的類,有不同的屬性。

       public class Customer{
          //包含所有級別的公共屬性
          ...
        }
       
       public class CustomerA extends Customer{
       //只包括一級客戶的特有屬性
        }

       public class CustomerB extends Customer{
       //只包含二級客戶特有的屬性
        }
這樣更符合面向對象的原則,然後在hbm.xml中這樣寫:
<id name="id" type="int">
    ...
</id>
<discriminator column="flag" type="string" />
<!-- 公共屬性的映射 -->
<subclass name="CustomerA" discriminator-value="A">
<!-- 一級客戶特有屬性的映射 -->
</subclass>
<subclass name="CustomerB" discriminator-value="B">
<!-- 二級客戶特有屬性的映射 -->
</subclass>

這樣就可以單獨的用CustomerA,CustomerB這樣的實例了,做數據庫修改時就不用關心flag字段的值了,會自動的加A或B。

如果是使用hibernate Annotation而不是xml來描述映謝關係,代碼如下:
@Entity
@Table(name = "customer")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "flag", discriminatorType = DiscriminatorType.STRING)
public class Customer{
}

@Entity
@DiscriminatorValue(value = "A")
public class CustomerA extends Customer{
}

@Entity
@DiscriminatorValue(value = "B")
public class CustomerB extends Customer{
}

這樣就可以了。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章