lombok 注解:
? ? ? ? @Data? :注解在類上;提供類所有屬性的 getting 和 setting 方法,此外還提供了equals、canEqual、
? ? ? ? ? ? ? ? ? ? ? ? ? hashCode、toString 方法
? ? ? ? @Setter:注解在屬性上;為屬性提供 setting 方法
? ? ? ? @Getter:注解在屬性上;為屬性提供 getting 方法
? ? ? ? @Log4j :注解在類上;為類提供一個(gè) 屬性名為log 的 log4j 日志對象
? ? ? ? @NoArgsConstructor:注解在類上;為類提供一個(gè)無參的構(gòu)造方法
? ? ? ? @AllArgsConstructor:注解在類上;為類提供一個(gè)全參的構(gòu)造方法
@Entity? 數(shù)據(jù)庫里對應(yīng)一個(gè)表
@Entity(name="t_students")? //使用了這個(gè)注解以后? 這個(gè)屬性就可以映射成關(guān)系型數(shù)據(jù)庫中的一張叫做t_students的表? 沒有name的話就默認(rèn)生成students
@GeneratedValue
通過annotation來映射hibernate實(shí)體的,基于annotation的hibernate主鍵標(biāo)識為@Id,?
其生成規(guī)則由@GeneratedValue設(shè)定的.這里的@id和@GeneratedValue都是JPA的標(biāo)準(zhǔn)用法,?
JPA提供的四種標(biāo)準(zhǔn)用法為TABLE,SEQUENCE,IDENTITY,AUTO.?
TABLE:使用一個(gè)特定的數(shù)據(jù)庫表格來保存主鍵。?
SEQUENCE:根據(jù)底層數(shù)據(jù)庫的序列來生成主鍵,條件是數(shù)據(jù)庫支持序列。?
IDENTITY:主鍵由數(shù)據(jù)庫自動生成(主要是自動增長型)?
AUTO:主鍵由程序控制。?
@Temporal(TemporalType.DATE) 格式化時(shí)間日期
1.日期:
@Temporal(TemporalType.DATE)
?@Column(name = "applyDate", nullable = false, length = 10)
?public Date getApplyDate() {
??return applyDate;
?}
在頁面端取值:2011-04-12
?2.時(shí)間:
@Temporal(TemporalType.TIME)
在頁面端取值:22:50:30
?3.日期和時(shí)間(默認(rèn)):
@Temporal(TemporalType.TIMESTAMP)?
在頁面端取值:2011-04-12 22:51:34.0
?@OneToMany(mappedBy="order",cascade = CascadeType.ALL, fetch = FetchType.LAZY)?
//這里配置關(guān)系,并且確定關(guān)系維護(hù)端和被維護(hù)端。mappedBy表示關(guān)系被維護(hù)端,只有關(guān)系端有權(quán)去更新外鍵。這里還有注意OneToMany默認(rèn)的加載方式是賴加載。當(dāng)看到設(shè)置關(guān)系中最后一個(gè)單詞是Many,那么該加載默認(rèn)為懶加載???
(1)ManyToOne(多對一)單向:不產(chǎn)生中間表,但可以用@Joincolumn(name="??")來指定生成外鍵的名字,外鍵在多的一方表中產(chǎn)生!
(2)OneToMany(一對多)單向:會產(chǎn)生中間表,此時(shí)可以用@onetoMany @Joincolumn(name="?")避免產(chǎn)生中間表,并且指定了外鍵的名字(別看 ? ? ? ? ?@joincolumn在一中寫著,但它存在在多的那個(gè)表中)
(3)OneToMany?,ManyToOne?雙向(兩個(gè)注解一起用的):如果不在@OneToMany中加mappedy屬性就會產(chǎn)生中間表,此時(shí)通常在@ManyToOne的注 ? ? ? ? ? ?解下再添上注解@Joincolumn(name=" ")來指定外鍵的名字(說明:多的一方為關(guān)系維護(hù)端,關(guān)系維護(hù)端負(fù)責(zé)外鍵記錄的更新,關(guān)系被維護(hù)端沒有權(quán)利更新外鍵記錄)?。ˊOneToMany(mappedBy="一對多中,多中一的屬性")出現(xiàn)mapby為被維護(hù)端|||默認(rèn)為延遲加載)
用例:@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="child_id")
private OrderChild orderChild;
? @OneToMany(mappedBy="orderChild",fetch=FetchType.LAZY,cascade={CascadeType.MERGE})
? @NotFound(action=NotFoundAction.IGNORE)//代表可以為空,允許為null
? private List goodsList;
hibernate中@ManyToOne默認(rèn)是立即加載,@OneToMany默認(rèn)是懶加載
但是如果加上了@NotFound之后設(shè)置的fetch=FetchType.LAZY是不起作用的,也就是設(shè)置@NotFound后變?yōu)榱肆⒓醇虞deager
?@OrderBy(value =?"id ASC")
mappedBy
?mappedBy屬性用于雙向關(guān)聯(lián)實(shí)體時(shí)使用。
CascadeTypeType.ALL
? ? ? cascade屬性表示與此實(shí)體一對一關(guān)聯(lián)的實(shí)體的聯(lián)級樣式類型。聯(lián)級樣式上當(dāng)對實(shí)體進(jìn)行操作時(shí)的策略。
?????? 說明:在定義關(guān)系時(shí)經(jīng)常會涉及是否定義Cascade(級聯(lián)處理)屬性,擔(dān)心造成負(fù)面影響.
????????·不定義,則對關(guān)系表不會產(chǎn)生任何影響
????????·CascadeType.PERSIST (級聯(lián)新建)
????????·CascadeType.REMOVE (級聯(lián)刪除)
????????·CascadeType.REFRESH (級聯(lián)刷新)
????????·CascadeType.MERGE (級聯(lián)更新)中選擇一個(gè)或多個(gè)。
????????·還有一個(gè)選擇是使用CascadeType.ALL ,表示選擇全部四項(xiàng)
fetch = FetchType.LAZY懶加載
如果是EAGER,那么表示取出這條數(shù)據(jù)時(shí),它關(guān)聯(lián)的數(shù)據(jù)也同時(shí)取出放入內(nèi)存中
如果是LAZY,那么取出這條數(shù)據(jù)時(shí),它關(guān)聯(lián)的數(shù)據(jù)并不取出來,在同一個(gè)session中,什么時(shí)候要用,就什么時(shí)候取(再次訪
問數(shù)據(jù)庫)。但是,在session外,就不能再取了。用EAGER時(shí),因?yàn)樵趦?nèi)存里,所以在session外也可以取。
一般只在一邊設(shè)Eager,JPA接口默認(rèn)為一對多為Lazy,多對一為Eager,但是Hibernate反向工程生成Entity時(shí),多對一為Lazy,需要手動改為Eager。?而兩邊都設(shè)Eager,那么代碼中取一條記錄時(shí),會發(fā)2次SQL。
映射策略
# 外鍵關(guān)聯(lián):兩個(gè)表的關(guān)系定義在一個(gè)表中;
# 表關(guān)聯(lián):兩個(gè)表的關(guān)系單獨(dú)定義一個(gè)表中通過一個(gè)中間表來關(guān)聯(lián)。
映射策略——外鍵關(guān)聯(lián)
? ? ? ?@OneToMany(casade={CascadeTypeType.ALL})
???? ? @JoinColumn(name="customer_id")
因?yàn)橐粚Χ嗟膶?shí)體集合時(shí)保存在集合類中,因此必須指明集合類中保存的具體類型:
1)指定集合泛型的具體類型;如:public Collection getAddress() {...
2)指定targetEntity屬性類型;如:@OneToMany(targetEntity=AddressEO.class,casade={CascadeTypeType.ALL})
映射策略——表關(guān)聯(lián)
? ? ? ? @OneToMany(casade={CascadeTypeType.ALL})
????????@JoinTable(name="ref_customer_address",
???? ? ? ? ? ? ? ???joinColumn={@JoinColumn(name="customer_id",referencedColumnName="id")},
??????????? ? ? ? ? inverseJoinColumn={@JoinColumn(name="address_id",referencedColumnName="id")}
???????? )
# name屬性為連接兩個(gè)表的表名稱。若不指定,則使用默認(rèn)的表名稱,格式如下:
??????"表名1" + "_" + "表名2"
# joinColumn屬性表示,在保存關(guān)系的表中,所保存關(guān)聯(lián)關(guān)系的外鍵的字段,并配合@JoinColumn標(biāo)記使用;?@JoinColumn用于注釋表中的字段,與@Column不同的是它要保存表與表之間關(guān)系的字段;
# inverseJoinColumn屬性與joinColumn類似,它保存的是保存關(guān)系的另外一個(gè)外鍵字段;
# catalog和schema屬性表示實(shí)體指定點(diǎn)目錄名稱或數(shù)據(jù)庫名稱;
# uniqueConstraints屬性表示該實(shí)體所關(guān)聯(lián)的唯一約束條件,一個(gè)實(shí)體可以有多個(gè)唯一約束條件,默認(rèn)沒有約束;
注意:@JoinTable不僅能夠定義一對多的關(guān)聯(lián),也可以定義多對多表的關(guān)聯(lián)。
@NotEmpty 用在集合類上面?
@NotBlank 用在String上面?
@NotNull 用在基本類型上
@Enumerated(value=EnumType.ORDINAL)采用枚舉類型的序號值與數(shù)據(jù)庫進(jìn)行交互,?
此時(shí)數(shù)據(jù)庫的數(shù)據(jù)類型需要是數(shù)值類型,例如在實(shí)際操作中?
CatTest ct = new CatTest();?
ct.setColor(Color.BLUE);?
當(dāng)我們將對象gt保存到數(shù)據(jù)庫中的時(shí)候,數(shù)據(jù)庫中存儲的數(shù)值是BLUE在Color枚舉?
定義中的序號1(序號從零開始);
@Enumerated(value=EnumType.STRING)采用枚舉類型與數(shù)據(jù)庫進(jìn)行交互,?
此時(shí)數(shù)據(jù)庫的數(shù)據(jù)類型需要是NVACHAR2等字符串類型,例如在實(shí)際操作中?
CatTest ct = new CatTest();?
ct.setColor(Color.BLUE);?
數(shù)據(jù)庫中存儲的數(shù)值是BLUE字符串