lombok 注解:
? ? ? ? @Data? :注解在類上悔详;提供類所有屬性的 getting 和 setting 方法,此外還提供了equals、canEqual、
? ? ? ? ? ? ? ? ? ? ? ? ? hashCode酿愧、toString 方法
? ? ? ? @Setter:注解在屬性上;為屬性提供 setting 方法
? ? ? ? @Getter:注解在屬性上邀泉;為屬性提供 getting 方法
? ? ? ? @Log4j :注解在類上嬉挡;為類提供一個 屬性名為log 的 log4j 日志對象
? ? ? ? @NoArgsConstructor:注解在類上;為類提供一個無參的構(gòu)造方法
? ? ? ? @AllArgsConstructor:注解在類上汇恤;為類提供一個全參的構(gòu)造方法
@Entity? 數(shù)據(jù)庫里對應(yīng)一個表
@Entity(name="t_students")? //使用了這個注解以后? 這個屬性就可以映射成關(guān)系型數(shù)據(jù)庫中的一張叫做t_students的表? 沒有name的話就默認生成students
@GeneratedValue
通過annotation來映射hibernate實體的,基于annotation的hibernate主鍵標識為@Id,?
其生成規(guī)則由@GeneratedValue設(shè)定的.這里的@id和@GeneratedValue都是JPA的標準用法,?
JPA提供的四種標準用法為TABLE,SEQUENCE,IDENTITY,AUTO.?
TABLE:使用一個特定的數(shù)據(jù)庫表格來保存主鍵庞钢。?
SEQUENCE:根據(jù)底層數(shù)據(jù)庫的序列來生成主鍵,條件是數(shù)據(jù)庫支持序列因谎。?
IDENTITY:主鍵由數(shù)據(jù)庫自動生成(主要是自動增長型)?
AUTO:主鍵由程序控制基括。?
@Temporal(TemporalType.DATE) 格式化時間日期
1.日期:
@Temporal(TemporalType.DATE)
?@Column(name = "applyDate", nullable = false, length = 10)
?public Date getApplyDate() {
??return applyDate;
?}
在頁面端取值:2011-04-12
?2.時間:
@Temporal(TemporalType.TIME)
在頁面端取值:22:50:30
?3.日期和時間(默認):
@Temporal(TemporalType.TIMESTAMP)?
在頁面端取值:2011-04-12 22:51:34.0
?@OneToMany(mappedBy="order",cascade = CascadeType.ALL, fetch = FetchType.LAZY)?
//這里配置關(guān)系,并且確定關(guān)系維護端和被維護端财岔。mappedBy表示關(guān)系被維護端风皿,只有關(guān)系端有權(quán)去更新外鍵。這里還有注意OneToMany默認的加載方式是賴加載匠璧。當(dāng)看到設(shè)置關(guān)系中最后一個單詞是Many桐款,那么該加載默認為懶加載???
(1)ManyToOne(多對一)單向:不產(chǎn)生中間表,但可以用@Joincolumn(name="??")來指定生成外鍵的名字夷恍,外鍵在多的一方表中產(chǎn)生魔眨!
(2)OneToMany(一對多)單向:會產(chǎn)生中間表,此時可以用@onetoMany @Joincolumn(name="?")避免產(chǎn)生中間表酿雪,并且指定了外鍵的名字(別看 ? ? ? ? ?@joincolumn在一中寫著遏暴,但它存在在多的那個表中)
(3)OneToMany?,ManyToOne?雙向(兩個注解一起用的):如果不在@OneToMany中加mappedy屬性就會產(chǎn)生中間表,此時通常在@ManyToOne的注 ? ? ? ? ? ?解下再添上注解@Joincolumn(name=" ")來指定外鍵的名字(說明:多的一方為關(guān)系維護端执虹,關(guān)系維護端負責(zé)外鍵記錄的更新拓挥,關(guān)系被維護端沒有權(quán)利更新外鍵記錄)!(@OneToMany(mappedBy="一對多中袋励,多中一的屬性")出現(xiàn)mapby為被維護端|||默認為延遲加載)
用例:@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默認是立即加載当叭,@OneToMany默認是懶加載
但是如果加上了@NotFound之后設(shè)置的fetch=FetchType.LAZY是不起作用的茬故,也就是設(shè)置@NotFound后變?yōu)榱肆⒓醇虞deager
?@OrderBy(value =?"id ASC")
mappedBy
?mappedBy屬性用于雙向關(guān)聯(lián)實體時使用。
CascadeTypeType.ALL
? ? ? cascade屬性表示與此實體一對一關(guān)聯(lián)的實體的聯(lián)級樣式類型蚁鳖。聯(lián)級樣式上當(dāng)對實體進行操作時的策略磺芭。
?????? 說明:在定義關(guān)系時經(jīng)常會涉及是否定義Cascade(級聯(lián)處理)屬性,擔(dān)心造成負面影響.
????????·不定義,則對關(guān)系表不會產(chǎn)生任何影響
????????·CascadeType.PERSIST (級聯(lián)新建)
????????·CascadeType.REMOVE (級聯(lián)刪除)
????????·CascadeType.REFRESH (級聯(lián)刷新)
????????·CascadeType.MERGE (級聯(lián)更新)中選擇一個或多個醉箕。
????????·還有一個選擇是使用CascadeType.ALL 钾腺,表示選擇全部四項
fetch = FetchType.LAZY懶加載
如果是EAGER徙垫,那么表示取出這條數(shù)據(jù)時,它關(guān)聯(lián)的數(shù)據(jù)也同時取出放入內(nèi)存中
如果是LAZY放棒,那么取出這條數(shù)據(jù)時姻报,它關(guān)聯(lián)的數(shù)據(jù)并不取出來,在同一個session中间螟,什么時候要用吴旋,就什么時候取(再次訪
問數(shù)據(jù)庫)。但是厢破,在session外荣瑟,就不能再取了。用EAGER時摩泪,因為在內(nèi)存里笆焰,所以在session外也可以取。
一般只在一邊設(shè)Eager见坑,JPA接口默認為一對多為Lazy嚷掠,多對一為Eager,但是Hibernate反向工程生成Entity時鳄梅,多對一為Lazy叠国,需要手動改為Eager。?而兩邊都設(shè)Eager戴尸,那么代碼中取一條記錄時粟焊,會發(fā)2次SQL。
映射策略
# 外鍵關(guān)聯(lián):兩個表的關(guān)系定義在一個表中孙蒙;
# 表關(guān)聯(lián):兩個表的關(guān)系單獨定義一個表中通過一個中間表來關(guān)聯(lián)项棠。
映射策略——外鍵關(guān)聯(lián)
? ? ? ?@OneToMany(casade={CascadeTypeType.ALL})
???? ? @JoinColumn(name="customer_id")
因為一對多的實體集合時保存在集合類中,因此必須指明集合類中保存的具體類型:
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屬性為連接兩個表的表名稱。若不指定坦胶,則使用默認的表名稱透典,格式如下:
??????"表名1" + "_" + "表名2"
# joinColumn屬性表示,在保存關(guān)系的表中顿苇,所保存關(guān)聯(lián)關(guān)系的外鍵的字段峭咒,并配合@JoinColumn標記使用;?@JoinColumn用于注釋表中的字段纪岁,與@Column不同的是它要保存表與表之間關(guān)系的字段凑队;
# inverseJoinColumn屬性與joinColumn類似,它保存的是保存關(guān)系的另外一個外鍵字段幔翰;
# catalog和schema屬性表示實體指定點目錄名稱或數(shù)據(jù)庫名稱漩氨;
# uniqueConstraints屬性表示該實體所關(guān)聯(lián)的唯一約束條件西壮,一個實體可以有多個唯一約束條件,默認沒有約束叫惊;
注意:@JoinTable不僅能夠定義一對多的關(guān)聯(lián)款青,也可以定義多對多表的關(guān)聯(lián)。
@NotEmpty 用在集合類上面?
@NotBlank 用在String上面?
@NotNull 用在基本類型上
@Enumerated(value=EnumType.ORDINAL)采用枚舉類型的序號值與數(shù)據(jù)庫進行交互赋访,?
此時數(shù)據(jù)庫的數(shù)據(jù)類型需要是數(shù)值類型可都,例如在實際操作中?
CatTest ct = new CatTest();?
ct.setColor(Color.BLUE);?
當(dāng)我們將對象gt保存到數(shù)據(jù)庫中的時候,數(shù)據(jù)庫中存儲的數(shù)值是BLUE在Color枚舉?
定義中的序號1(序號從零開始)蚓耽;
@Enumerated(value=EnumType.STRING)采用枚舉類型與數(shù)據(jù)庫進行交互渠牲,?
此時數(shù)據(jù)庫的數(shù)據(jù)類型需要是NVACHAR2等字符串類型,例如在實際操作中?
CatTest ct = new CatTest();?
ct.setColor(Color.BLUE);?
數(shù)據(jù)庫中存儲的數(shù)值是BLUE字符串