天天看點

1-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{

       //隻包含二級客戶特有的屬性

        }

這樣更符合面向對象的原則,然後在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{

}

這樣就可以了。 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1522941