可能经常遇到这样的情况: 在数据库表中会有这样的一个字段用来区别记录的属性,如:在客户表中有一个字段表示客户级别,当这个记录为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{ } 这样就可以了。 |
|