Hibernate Annotations維護(hù)驗(yàn)證邏輯
Hibernate有很多值得學(xué)習(xí)的地方,這里我們主要介紹Hibernate Annotations,包括介紹HibernateDoclet等方面。
盡管在 Web 應(yīng)用程序中盡可能多的層次中構(gòu)建數(shù)據(jù)驗(yàn)證非常重要,但是這樣做卻非常耗時(shí),以至于很多開(kāi)發(fā)人員都會(huì)干脆忽略這個(gè)步驟 —— 這可能會(huì)導(dǎo)致今后大量問(wèn)題的產(chǎn)生。但是隨著***版本的 Java 平臺(tái)中引入了注釋,驗(yàn)證變得簡(jiǎn)單得多了。本文將向您介紹如何使用Hibernate Annotations 的 Validator 組件在 Web 應(yīng)用程序中輕松構(gòu)建并維護(hù)驗(yàn)證邏輯。
有時(shí)會(huì)有一種工具,它可以真正滿足開(kāi)發(fā)人員和架構(gòu)師的需求。開(kāi)發(fā)人員在***次下載這種工具當(dāng)天就可以在自己的應(yīng)用程序中開(kāi)始使用這種工具。理論上來(lái)說(shuō),這種工具在開(kāi)發(fā)人員花費(fèi)大量時(shí)間來(lái)掌握其用法之前就可以從中獲益。架構(gòu)師也很喜歡這種工具,因?yàn)樗梢詫㈤_(kāi)發(fā)人員導(dǎo)向更高理論層次的實(shí)現(xiàn)。Hibernate Annotations 的 Validator 組件就是一種這樣的工具。
Java SE 5 為 Java 語(yǔ)言提供了很多需要的增強(qiáng)功能,不過(guò)其他增強(qiáng)功能可能都不如 注釋 這樣潛力巨大。使用 注釋,我們就終于具有了一個(gè)標(biāo)準(zhǔn)、一級(jí)的元數(shù)據(jù)框架為 Java 類使用。Hibernate 用戶手工編寫(xiě) *.hbm.xml 文件已經(jīng)很多年了(或者使用 XDoclet 來(lái)自動(dòng)實(shí)現(xiàn)這個(gè)任務(wù))。如果手工創(chuàng)建了 XML 文件,那就必須對(duì)每個(gè)所需要的持久屬性都更新這兩個(gè)文件(類定義和 XML 映射文檔)。使用 HibernateDoclet 可以簡(jiǎn)化這個(gè)過(guò)程,但是這需要我們確認(rèn)自己的 HibernateDoclet 版本支持要使用的 Hibernate 的版本。doclet 信息在運(yùn)行時(shí)也是不可用的,因?yàn)樗痪帉?xiě)到了 Javadoc 風(fēng)格的注釋中了。Hibernate Annotations通過(guò)提供一個(gè)標(biāo)準(zhǔn)、簡(jiǎn)明的映射類的方法和所添加的運(yùn)行時(shí)可用性來(lái)對(duì)這些方式進(jìn)行改進(jìn)。
使用 HibernateDoclet 的 Hibernate 映射代碼
- /**
- * @hibernate.property column="NAME" length="60" not-null="true"
- */
- public String getName() {
- return this.name;
- }
- /**
- * @hibernate.many-to-one column="AGENT_ID" not-null="true" cascade="none"
- *outer-join="false" lazy="true"
- */
- public Agent getAgent() {
- return agent;
- }
- /**
- * @hibernate.set lazy="true" inverse="true" cascade="all" table="DEPARTMENT"
- * @hibernate.collection-one-to-many class="com.triview.model.Department"
- * @hibernate.collection-key column="DEPARTMENT_ID" not-null="true"
- */
- public List<Department> getDepartment() {
- return department;
- }
使用 Hibernate Annotations 的 Hibernate 映射代碼
- @NotNull
- @Column(name = "name")
- @Length(min = 1, max = NAME_LENGTH)
- // NAME_LENGTH is a constant declared elsewhere
- public String getName() {
- return name;
- }
- @NotNull
- @ManyToOne(cascade = {CascadeType.MERGE }, fetch = FetchType.LAZY)
- @JoinColumn(name = "agent_id")
- public Agent getAgent() {
- return agent;
- }
- @OneToMany(mappedBy = "customer", fetch = FetchType.LAZY)
- public List<Department> getDepartment() {
- return department;
- }
如果使用 HibernateDoclet,那么直到生成 XML 文件或運(yùn)行時(shí)才能捕獲錯(cuò)誤。使用 注釋,在編譯時(shí)就可以檢測(cè)出很多錯(cuò)誤;或者如果在編輯時(shí)使用了很好的 IDE,那么在編輯時(shí)就可以檢測(cè)出部分錯(cuò)誤。在從頭創(chuàng)建應(yīng)用程序時(shí),可以利用 hbm2ddl 工具為自己的數(shù)據(jù)庫(kù)從 hbm.xml 文件中生成 DDL。一些重要的信息 —— 比如name 屬性的***長(zhǎng)度必須是 60 個(gè)字符,或者 DDL 應(yīng)該添加非空約束 —— 都被從 HibernateDoclet 項(xiàng)添加到 DDL 中。當(dāng)使用注釋時(shí),我們可以以類似的方式自動(dòng)生成 DDL。
【編輯推薦】