|
可能經(jīng)常遇到這樣的情況: 在數(shù)據(jù)庫表中會有這樣的一個字段用來區(qū)別記錄的屬性,如:在客戶表中有一個字段表示客戶級別,當(dāng)這個記錄為A時是一級客戶,為B時是二級客戶。在用hiberante做OR表示時類可能是這樣的: public class Customer{ private String flag; //表示客戶的級別 ... } 然后,在程序中手動控制flag的值,但是這樣當(dāng)每個級的客戶有不同的屬性時Customer類將包含所有級別的屬性,這樣不是很好。 hibernate提供一個Discriminator映射的方法,就是把一個表映射成不同的類,有不同的屬性。 public class Customer{ //包含所有級別的公共屬性 ... } public class CustomerA extends Customer{ //只包括一級客戶的特有屬性 } public class CustomerB extends Customer{ //只包含二級客戶特有的屬性 } 這樣更符合面向?qū)ο蟮脑瓌t,然后在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> 這樣就可以單獨(dú)的用CustomerA,CustomerB這樣的實(shí)例了,做數(shù)據(jù)庫修改時就不用關(guān)心flag字段的值了,會自動的加A或B。 如果是使用hibernate Annotation而不是xml來描述映謝關(guān)系,代碼如下: @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{ } 這樣就可以了。 |
|
|