日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对 Entity 的初步构思

發(fā)布時間:2025/3/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对 Entity 的初步构思 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

本文是《輕量級 Java Web 框架架構(gòu)設(shè)計》的系列博文。

Hibernate 框架確實挺好,最早我們使用它的?ORM 配置文件,當(dāng)時確實覺得有些累。于是后來就有了 Doclet 這樣的技術(shù),這樣 ORM 配置文件就不用寫了,但 Java Doc 卻要寫一大堆。直到最后,救星終于來了!它就是 JPA。隨后, Hibernate 就成為 JPA 規(guī)范中的一個實現(xiàn)了,這表明了什么呢?注解才是去掉繁重的?XML 配置文件的真正解決之道(至少目前是這樣,將來就不好說了)。我也深受了 JPA 的影響,想搞一個更加輕量級的 JPA,目的就是實用性強(qiáng),此外還需要通過編碼規(guī)范來確保每個程序員都能正確的完成自己的工作任務(wù)。

領(lǐng)域建模是 Hibernate 所推崇的開發(fā)方式,首先要根據(jù)業(yè)務(wù)需求確定 Domain,用?Hibernate?的話來講就是 Entity(實體)。下面以 Product ?Entity為例,描述一下我對 Entity 的構(gòu)想:

@Table("product") public class Product extends Entity {@Column("product_type_id")private long productTypeId;@Column("product_name")private String productName;@Column("product_code")private String productCode;@Column("price")private int price;@Column("description")private String description;public long getProductTypeId() {return productTypeId;}public void setProductTypeId(long productTypeId) {this.productTypeId = productTypeId;}public String getProductName() {return productName;}public void setProductName(String productName) {this.productName = productName;}... 省略其他 getter/setter 方法 }

第1行:使用 @Table 注解來定義 Product 實體對應(yīng)于 product 表,這注解與 JPA 的 @Entity +?@Table 作用相同,可認(rèn)為這里簡化了配置。

第2行:該 Product Entity 繼承于 Entity,這樣做是為了在父類?Entity 中封裝每個業(yè)務(wù)實體所共有的屬性,例如:id,MySQL 建議我們每張表最好有一個 id 主鍵,我想還是它的道理的。

第3行:使用 @Column 注解標(biāo)明 productName 屬性與 product_name 列相對應(yīng)。當(dāng)然,這里是不是也要 JPA 那樣,指定 Column 的數(shù)據(jù)類型以及長度與精度呢?我個人認(rèn)為這是不必要的,因為在實際開發(fā)工作當(dāng)中,一般是由架構(gòu)師或者 DBA 來創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu)(即 Database Schema),我們拿到這份表結(jié)構(gòu)文檔之后,在此基礎(chǔ)之上再編寫相應(yīng)的 Entity。所以,我們在編寫這個 Entity 的時候,可以假設(shè)數(shù)據(jù)庫已經(jīng)存在了,而無需再像 Hibernate 那樣根據(jù) Entity 中的注解自動生成數(shù)據(jù)庫的?DDL。這樣自動化的生成,其實對項目的風(fēng)險也挺大的。此外,這里推薦對每個屬性都配置 @Column 注解,不管它們的拼寫是否完全一致。當(dāng)然不寫 @Column 注解也是可以的,但是這個不妨作為編碼規(guī)范,把 Code Review 的任務(wù)交給架構(gòu)師去吧。

下面再來看看這個 Entity 類吧:

public abstract class Entity extends Bean {@Column("id")private long id;public long getId() {return id;}public void setId(long id) {this.id = id;} }

它是一個抽象類。其實就包含一個 id 屬性,當(dāng)然可以從業(yè)務(wù)需求中可以盡可能的抽象出公共的屬性,統(tǒng)一在這里定義。注意,該類又繼承了一個 Bean 類,那么這個 Bean 類又是怎樣的呢??

最后再來看看這個 Bean?類吧:

public abstract class Bean implements Serializable {@Overridepublic int hashCode() {return HashCodeBuilder.reflectionHashCode(this);}@Overridepublic boolean equals(Object obj) {return EqualsBuilder.reflectionEquals(this, obj);}@Overridepublic String toString() {return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);}public String toJson() {return JSONUtil.toJSON(this);}public String toXML() {return XMLUtil.toXML(this);} } 它也是一個抽象類。首先,它實現(xiàn)了?Serializable 接口,也就是可以序列化了,這樣更有助于網(wǎng)絡(luò)傳輸。為什么要將序列化接口實現(xiàn)在最基礎(chǔ)的 Bean 類中呢?這樣做是因為,繼承該類的其他子類無需再次實現(xiàn)這個序列化接口了,配置也更加簡單了。 其次,這里還定義了一些公共方法,Java 自帶的 hashCode()、equals()、toString() 方法,這些方法均使用了 Apache Commons 的? lang 包來實現(xiàn)。 ?最后,還有兩個非常實用的方法,toJSON() 與 toXML() 方法,其作用我想已經(jīng)不言而喻了。


如果有了以上這樣的繼承體系,那么每個 Entity 是不是更加強(qiáng)大了呢?此外,Bean 類還可用于非 Entity 類上,這樣它的功能又進(jìn)一步得到了復(fù)用。

請大家對以上構(gòu)思,提點建議或意見吧!


補(bǔ)充(2013-09-03)

根據(jù)大家提供的建議,我將 Entity 定義為以下結(jié)構(gòu):

public class Product extends BaseEntity {private long productTypeId;private String productName;private String productCode;private int price;private String description;public long getProductTypeId() {return productTypeId;}public void setProductTypeId(long productTypeId) {this.productTypeId = productTypeId;}... }

這里沒有任何的注解,只是繼承了 BaseEntity 這個類(也就是上文提到的 Entity 抽象類,為了便于理解,這里將其重命名為 BaseEntity)。Java 類中的 Field 會自動映射為數(shù)據(jù)庫中的 Column,映射規(guī)則只是將“駝峰風(fēng)格”的 Field 與“下劃線”風(fēng)格的 Column 進(jìn)行映射,例如:productTypeId 對應(yīng)于 product_type_id。這些映射規(guī)則完全由框架來實現(xiàn),對程序員完全透明,程序員要做的事情就是 extends BaseEntity 了。?

是不是比 JPA 要簡單呢?那么框架又是如何實現(xiàn)的呢?敬請期待...

轉(zhuǎn)載于:https://my.oschina.net/huangyong/blog/158481

總結(jié)

以上是生活随笔為你收集整理的对 Entity 的初步构思的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。