領域驅動設計核心是領域物件識別,一切操作皆是物件,這也是物件導向程式設計所倡導的。在設計實體屬性時,除了資料庫能識別的標準資料型別外,也越來越多考慮複合型的物件屬性。讓我們的設計視角為資料儲存的層面轉向客觀事物存在的實際表象。orm框架也就是為此提供技術支撐,至少jpa朝此方向不斷完善的。
先上**:(此**主要為展示功能而設計,不一定具體設計的合理性,由於篇幅**略有刪減)
@entity
public
class
saleorder
implements
serializable
)private station instation;
@embedded
@attributeoverrides()
private station outstation;
private localdatetime saletime;
private address address;
@manytoone
(cascade = cascadetype.refresh)
@joincolumn
(name =
"membercode"
, referencedcolumnname =
"membercode"
)private member member;
@enumerated
(enumtype.string)
private orderstate orderstate;
@onetomany
(cascade =
)@joincolumn
(name =
"saleordercode"
, referencedcolumnname =
"ordercode"
)private list
orderdetaillist;
}
member為引用物件,使用membercode做兩個表的關聯,saleorder不能有操作member物件的許可權,只做級聯重新整理,使用cascadetype.refresh
。
在設定會員物件時,這裡只要求有membercode便足夠
saleorder.
setmember
(member.
builder()
.membercode
("m001").
build()
);
當然,在實際業務中,訂單和會員兩個模組應該是分離的,屬於不同的微服務,這樣可以直接使用private string membercode即可
程式中為了讓**更友好,大部分使用列舉物件來表示實體的狀態,而在資料庫欄位中表示狀態值一般我們使用int,但可讀性較差。在一些狀態較多的情況下,為了增強資料的可讀性,可以使用string來表示
@enumerated
(enumtype.string)
private orderstate orderstate;
address物件是saleorder的乙個屬並一直是saleorder的一部分,在資料庫層面不單獨維護表,直接將所有字段合併入sale_order表中
@embeddable
public
class
address
有人會問:為什麼不將address物件的屬性直接放在saleorder中呢如果乙個主物件引用兩個同樣的子物件屬性時,為引發兩個子物件屬性字段重名,故可以使用答:這樣做在技術層面是沒有問題的,但設計上address中的屬性 username,city,street放入主物件的話就破壞了saleorder的結構完整性,沒有了3個屬性共同表示位址的準確語意表達,維護起來也較麻煩
@attributeoverride
重寫屬性的欄位名,也可適用於子物件的子物件
@embedded
@attributeoverrides()
private station instation;..
.@embeddable
public
class
station
@embeddable
public
class
storage
private localdatetime saletime;..
.@converter
true
)public
class
localdatetimeconverter
implements
attributeconverter
zoneid zone = zoneid.
systemdefault()
; instant instant = localdatetime.
atzone
(zone)
.toinstant()
;return instant.
toepochmilli()
;}@override
public localdatetime converttoentityattribute
(long along)
return localdatetime.
ofinstant
(instant.
ofepochmilli
(along)
, zoneid.
systemdefault()
);}}
public
class
orderdetail
public
abstract
class
abstractproduct
public
class
book
extends
abstractproduct
}public
class
food
extends
abstractproduct
}
在屬性物件不明確的情況下可以定義抽象類,使用@convert
做型別轉換
public
class
productconverter
implements
attributeconverter
else
if(attribute instanceof
book
)return"";
}@override
public abstractproduct converttoentityattribute
(string dbdata)
else
}}
使用抽象類定義屬性,主要目的是保持屬性類的多樣性或擴充套件性,對於資料庫本身可能是固定的乙個值,但對於實體物件,程式設計來講可以保持更多變化的可能性。
總結:本節主要講述了實體屬性物件設定關係,主要目的是維持物件的結構清晰和可擴充套件性,也提供了另一種設計的可能性。但在實現業務過程中還是要因地制宜,根據實際情況出發,避免過度設計而增加複雜度js物件屬性操作
當你知道屬性的名稱的時候,使用點操作符。這是乙個使用點操作符讀取物件屬性的例子 var myobj var prop1val myobj.prop1 val1 var prop2val myobj.prop2 val2 第二種訪問物件的方式就是中括號操作符 如果你想訪問的屬性的名稱有乙個空格,這時你...
3 JPA物件關係對映 級聯操作
物件對映關係分為單向關係和雙向關係,單向關係只在一方物件上存在對方物件,雙向關係是在雙方物件上存在彼此物件。public class department implements serializable joincolumn private list employeelist 在沒有 joincol...
Python物件屬性的操作
如何給物件新增 修改屬性 給物件新增屬性 p1.name zhangsan print p1.name 修改物件屬性值 p1.name lisi print p1.name setattr 是乙個內建函式,是給物件新增屬性和值 setattr 物件,屬性名 字串 屬性值 setattr p1,key...