可能經常遇到這樣的情況:
在數據庫表中會有這樣的一個字段用來區別記錄的屬性,如:在客戶表中有一個字段表示客戶級別,當這個記錄為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{
}
這樣就可以了。