Java中使用到的注解

JPA的注解

1.@MappedSuperclass
1)@MappedSuperclass注解只能標(biāo)準(zhǔn)在類上:
@Target({java.lang.annotation.ElementType.TYPE})

  1. 標(biāo)注為@MappedSuperclass的類將不是一個完整的實體類宾濒,他將不會映射到數(shù)據(jù)庫表,但是他的屬性都將映射到其子類的數(shù)據(jù)庫字段中线梗。
  2. 標(biāo)注為@MappedSuperclass的類不能再標(biāo)注@Entity或@Table注解背稼,也無需實現(xiàn)序列化接口益楼。
    但是如果一個標(biāo)注為@MappedSuperclass的類繼承了另外一個實體類或者另外一個同樣標(biāo)注了@MappedSuperclass的類的話景殷,他將可以使用@AttributeOverride或@AttributeOverrides注解重定義其父類(無論是否是實體類)的屬性映射到數(shù)據(jù)庫表中的字段乙各。
    比如可以重定義字段名或長度等屬性骡湖,使用@AttributeOverride中的子屬性@Column進(jìn)行具體的定義。

注意:對于其父類中標(biāo)注@Lob注解的屬性將不能重載莫换,并且@AttributeOverride里的@Column設(shè)置都將不起作用霞玄。

JPA規(guī)范中對@Lob注解并沒有說明不能同時標(biāo)注@Column注解,但是在實際使用中Hibernate JPA不支持這中標(biāo)注方式拉岁。

  1. 此外坷剧,這樣的類還可以直接標(biāo)注@EntityListeners實體監(jiān)聽器,他的作用范圍僅在其所有繼承類中喊暖,并且實體監(jiān)聽器同樣可以保被其子類繼承或重載惫企。
  2. 標(biāo)注為@MappedSuperclass的類其屬性最好設(shè)置為protected或default類型的,以保證其同一個包下的子類可以直接調(diào)用它的屬性陵叽。便于實體監(jiān)聽器或帶參數(shù)構(gòu)造函數(shù)的操作雅任。

2.@Id

@Id 注解可將實體Bean中某個屬性定義為主鍵。

3.@GeneratedValue

通過annotation來映射hibernate實體的咨跌,基于annotation的hibernate主鍵標(biāo)識為@Id沪么,
其生成規(guī)則是由@GeneratedValue設(shè)定的。這里的@id和@GeneratedValue都是JPA的標(biāo)準(zhǔn)用法锌半。

GenerationType:

public enum GenerationType{      
    TABLE,      
    SEQUENCE,      
    IDENTITY,      
    AUTO     
}   

JPA提供的四種標(biāo)準(zhǔn)用法為TABLE禽车,SEQUENCE,IDENTITY刊殉,AUTO殉摔。

a,TABLE:使用一個特定的數(shù)據(jù)庫表格來保存主鍵记焊。 
b逸月,SEQUENCE:根據(jù)底層數(shù)據(jù)庫的序列來生成主鍵,條件是數(shù)據(jù)庫支持序列遍膜。 
c碗硬,IDENTITY:主鍵由數(shù)據(jù)庫自動生成(主要是自動增長型) 
d,AUTO:主鍵由程序控制瓢颅。 

4.@JoinColumn

@OneToOne注釋只能確定實體與實體的關(guān)系是一對一的關(guān)系恩尾,不能指定數(shù)據(jù)庫表中的保存的關(guān)聯(lián)字段。所以此時要結(jié)合@JoinColumn標(biāo)記來指定保存實體關(guān)系的配置挽懦。

@JoinColumn與@Column標(biāo)記一樣翰意,是用于注釋表中的字段的。它的屬性與@Column屬性有很多相同之處

@JoinColumn與@Column相區(qū)別的是:@JoinColumn注釋的是保存表與表之間關(guān)系的字段,它要標(biāo)注在實體屬性上冀偶。而@Column標(biāo)注的是表中不包含表關(guān)系的字段醒第。

與@Column標(biāo)記一樣,name屬性是用來標(biāo)識表中所對應(yīng)的字段的名稱进鸠。例如customer表中存在字段addr_id稠曼,標(biāo)識的代碼如下所示。

兩張表結(jié)構(gòu)如下

TABLE_A:
ID, COLA1, COLA2

TABLE_B:
ID, A_ID, COLB1, COLB2

A和B是一對多的關(guān)系堤如。
我在B的BEAN上面蒲列,通過Anotation建立如下關(guān)系窒朋。

@ManyToOne(cascade = CascadeType.REFRESH, targetEntity = TABLE_A.class)
@JoinColumn(name = "A_ID", referencedColumnName = "ID", nullable = true, insertable = false, updatable = false)

5.Hibernate的集合映射cascade

1)到底在哪兒使用cascade="..."
cascade屬性并不是多對多關(guān)系一定要使用的搀罢,有了它只是讓我們在插入或者刪除對象時更加方便一些。只要在cascade的源頭上插入或者刪除侥猩,所有cascade的關(guān)系就會被自己動的插入或者刪除榔至。便是為了能正確的cascade,unsaved-value的話欺劳,那說明這個對象不是persistence object要save(insert)唧取;如果id是非unsaved-value的話,那說明這個兌現(xiàn)格式persistence object(數(shù)據(jù)庫已經(jīng)存在)划提,只要update就行枫弟。saveOrUpdate方法用的也是這個機制。

cascade屬性的可能值有:
all:所有情況下均進(jìn)行關(guān)聯(lián)操作鹏往,即save-update和delete淡诗。
none:所有情況下均不進(jìn)行關(guān)聯(lián)操作。這個是默認(rèn)值伊履。
save-update:在執(zhí)行save/update/saveOrUpdate時進(jìn)行關(guān)聯(lián)操作韩容。
delete:在執(zhí)行delete 時進(jìn)行關(guān)聯(lián)操作.
all-delete-orphan: 當(dāng)一個節(jié)點在對象圖中成為孤兒節(jié)點時,刪除該節(jié)點唐瀑。比如在一個一對多的關(guān)系中群凶,Student包含多個book,當(dāng)在對象關(guān)系中刪除一個book時哄辣,此book即成為孤兒節(jié)點请梢。

6.@ApiModel

屬于swagger注解。

7.@Transient

ORM框架將忽略該屬性力穗;
如果一個屬性并非數(shù)據(jù)庫表的字段映射溢陪,就務(wù)必將其標(biāo)示為@Transient,否則ORM框架默認(rèn)其注解為@Basic睛廊;
表示該字段在數(shù)據(jù)庫表中沒有形真。

@Transient
public int getAge() {
 return 1+1;
}

注意:

//子字典項
    @OneToMany(mappedBy = "parent")
    @JsonIgnore(value = true)
    List<Dict> subdicts;

只有OneToOne,OneToMany,ManyToMany上才有mappedBy屬性咆霜,ManyToOne不存在該屬性.mappedBy標(biāo)簽一定是定義在被擁有方的邓馒,他指向擁有方;
mappedBy的含義蛾坯,應(yīng)該理解為光酣,擁有方能夠自動維護(hù)跟被擁有方的關(guān)系,當(dāng)然脉课,如果從被擁有方救军,通過手工強行來維護(hù)擁有方的關(guān)系也是可以做到的;
mappedBy跟joinColumn/JoinTable總是處于互斥的一方倘零,可以理解為正是由于擁有方的關(guān)聯(lián)被擁有方的字段存在唱遭,擁有方才擁有了被擁有方。mappedBy這方定義JoinColumn/JoinTable總是失效的呈驶,不會建立對應(yīng)的字段或者表拷泽。

例子:
人跟身份證雙向關(guān)聯(lián)

在person里面定義的注釋代碼:

@OneToOne(cascade = CascadeTye.ALL,optional = true)  
public IDCard getIdCard(){  
   return idCard;  
}  

//Jackson相關(guān):

8.@JsonIgnoreProperties
此注解是類注解,作用是json序列化時將java bean中的一些屬性忽略掉袖瞻,序列化和反序列化都受影響司致。

9.@JsonIgnore

此注解用于屬性或者方法上(最好是屬性上),作用和上面的@JsonIgnoreProperties一樣聋迎。

10.@JsonSerialize

此注解用于屬性或者getter方法上脂矫,用于在序列化時嵌入我們自定義的代碼,比如序列化一個double時在其后面限制兩位小數(shù)點霉晕。

11.@JsonDeserialize

此注解用于屬性或者setter方法上庭再,用于在反序列化時可以嵌入我們自定義的代碼,類似于上面的@JsonSerialize

12.@SuppressWarnings
在Java編譯過程中會出現(xiàn)很多警告娄昆,有很多是安全的佩微,但是每次編譯有很多警告影響我們對error的過濾和修改,我們可以在代碼中加上:@SuppressWarnings(“XXXX”) 來解決

例如:@SuppressWarnings("deprecation")表示不顯示使用了不贊成使用的類或方法時的警告

13.@Repository

spring中的注解萌焰。
用于標(biāo)注數(shù)據(jù)訪問組件哺眯,即Dao組件。

在一個稍大的項目中扒俯,如果組件采用xml的bean定義來配置奶卓,顯然會增加配置文件的體積,查找以及維護(hù)起來也不太方便撼玄。

Spring2.5為我們引入了組件自動掃描機制夺姑,他在類路徑下尋找標(biāo)注了上述注解的類,并把這些類納入進(jìn)spring容器中管理掌猛。

它的作用和在xml文件中使用bean節(jié)點配置組件時一樣的盏浙。要使用自動掃描機制,我們需要打開以下配置信息:

<?xml version="1.0" encoding="UTF-8" ?>   
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
                http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context-2.5.xsd">   
     
    <context:component-scan base-package=”com.你的項目.你的項目”>     
</beans>
  1. @Repository、@Service废膘、@Controller 和 @Component

spring從2.0開始逐步引入一些注釋用于簡化Spring的開發(fā)竹海,@Repository注解是2.5引入的。用于將數(shù)據(jù)訪問層(Dao層)的類標(biāo)識為Spring Bean丐黄。具體只需要將該注解標(biāo)注在Dao類上即可斋配。
同時,為了讓Spring能夠掃描類路徑中的類并識別出@Repository注解灌闺,需要在XML配置文件中棄用Bean的自動掃描功能艰争,這可以通過<context:component-scan/>實現(xiàn)。
如此的話桂对,就不需要我們在XML中顯示使用<bean/>去配置bean甩卓。Spring在容器初始化時將自動掃描base-package指定的包以及包下的所有java文件,所有標(biāo)注了@Respository的類都會被注冊為SpringBean接校。
注意:@Repository只能標(biāo)注在Dao類上猛频。
因為該注解的作用不只是將類識別為Bean狮崩。同事還能降所有標(biāo)注中跑出的數(shù)據(jù)訪問異常封裝為Spring的數(shù)據(jù)訪問異常類型蛛勉。Spring本身提供了一個豐富的并且是與具體的數(shù)據(jù)訪問技術(shù)無關(guān)的數(shù)據(jù)訪問異常機構(gòu),用于封裝不同的持久層框架拋出的異常睦柴,使得異常獨立于底層的框架诽凌。
Spring2.5在@Repository的基礎(chǔ)上增加了功能累死的額外三個注解:@Component,@Service,@Controller
它們分別用于軟件系統(tǒng)的不同層次:
1)@Component: 是一個泛化的概念坦敌,僅僅表示一個組件(Bean),可以作用在任何層次侣诵。
2)@Service: 通常作用在業(yè)務(wù)層,但是目前該功能與@Component相同狱窘。
3)@Controller:通常作用在控制層杜顺,但是目前該功能與@Component相同。
通過在類上使用@Repository蘸炸、@Component躬络、@Service 和 @Constroller注解,Spring會自動創(chuàng)建相應(yīng)的 BeanDefinition 對象,并注冊到 ApplicationContext 中搭儒。這些類就成了Spring受管組件穷当。這三個注解除了作用于不同的軟件層次的類,其使用方式與@Repository是完全相同的淹禾。
另外馁菜,除了上面的四個注解外,用戶可以創(chuàng)建自定義的注解铃岔,然后在注解上標(biāo)注 @Component汪疮,那么,該自定義注解便具有了與所@Component 相同的功能。不過這個功能并不常用智嚷。
當(dāng)一個 Bean 被自動檢測到時躲胳,會根據(jù)那個掃描器的 BeanNameGenerator 策略生成它的 bean名稱。默認(rèn)情況下纤勒,對于包含 name 屬性的 @Component坯苹、@Repository、 @Service 和@Controller摇天,會把 name 取值作為 Bean 的名字粹湃。如果這個注解不包含 name值或是其他被自定義過濾器發(fā)現(xiàn)的組件,默認(rèn) Bean 名稱會是小寫開頭的非限定類名泉坐。如果你不想使用默認(rèn) bean命名策略为鳄,可以提供一個自定義的命名策略。首先實現(xiàn) BeanNameGenerator接口腕让,確認(rèn)包含了一個默認(rèn)的無參數(shù)構(gòu)造方法孤钦。然后在配置掃描器時提供一個全限定類名,如下所示:

 <beans ...> 
 <context:component-scan 
    base-package="a.b" name-generator="a.SimpleNameGenerator"/> 
 </beans> 

與通過 XML 配置的 Spring Bean 一樣纯丸,通過上述注解標(biāo)識的Bean偏形,其默認(rèn)作用域是"singleton",為了配合這四個注解觉鼻,在標(biāo)注 Bean 的同時能夠指定 Bean 的作用域俊扭,Spring2.5 引入了 @Scope 注解。使用該注解時只需提供作用域的名稱就行了坠陈,如下所示:

 @Scope("prototype") 
 @Repository 
 public class Demo { … } 

如果你想提供一個自定義的作用域解析策略而不使用基于注解的方法萨惑,只需實現(xiàn) ScopeMetadataResolver接口,確認(rèn)包含一個默認(rèn)的沒有參數(shù)的構(gòu)造方法仇矾。然后在配置掃描器時提供全限定類名:

 <context:component-scan base-package="a.b"
 scope-resolver="footmark.SimpleScopeResolver" /> 

注意:@Scope("prototype") 是多例庸蔼,默認(rèn)是單例的。
單例是不安全的贮匕,會導(dǎo)致屬性重復(fù)使用姐仅。
最佳實踐:
1、不要在controller中定義成員變量粗合。
2萍嬉、萬一必須要定義一個非靜態(tài)成員變量時候,則通過注解@Scope("prototype")隙疚,將其設(shè)置為多例模式壤追。

15.@Autowired 注解與自動裝配

我們編寫spring 框架的代碼時候。一直遵循是這樣一個規(guī)則:所有在spring中注入的bean 都建議定義成私有的域變量供屉。并且要配套寫上 get 和 set方法行冰。

Spring 2.5引入了@Autowired注解溺蕉,它可以對類成員變量,方法以及構(gòu)造函數(shù)進(jìn)行標(biāo)注悼做,完成自動裝配的工作疯特。通過@Autowired的使用來消除set,get方法。
在applicationContext.xml中加入:

<!-- 該 BeanPostProcessor 將自動對標(biāo)注 @Autowired 的 Bean 進(jìn)行注入 -->     
  <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> 

Spring 通過一個 BeanPostProcessor 對 @Autowired 進(jìn)行解析肛走,所以要讓 @Autowired 起作用必須事先在 Spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean漓雅。

package com.baobaotao;     
import org.springframework.beans.factory.annotation.Autowired;     
    
public class Boss {     
    
    @Autowired    
    private Car car;     
    
    @Autowired    
    private Office office;     
    
    …     
} 

當(dāng) Spring 容器啟動時,AutowiredAnnotationBeanPostProcessor 將掃描 Spring 容器中所有 Bean朽色,當(dāng)發(fā)現(xiàn) Bean 中擁有 @Autowired 注釋時就找到和其匹配(默認(rèn)按類型匹配)的 Bean邻吞,并注入到對應(yīng)的地方中去。

@Autowired 將查找被標(biāo)注的方法的入?yún)㈩愋偷?Bean葫男,并調(diào)用方法自動注入這些 Bean抱冷。而下面的使用方法則對構(gòu)造函數(shù)進(jìn)行標(biāo)注:

package com.baobaotao;     
    
public class Boss {     
    private Car car;     
    private Office office;     
      
    @Autowired    
    public Boss(Car car ,Office office){     
        this.car = car;     
        this.office = office ;     
    }     
      
    …     
} 

由于 Boss() 構(gòu)造函數(shù)有兩個入?yún)ⅲ謩e是 car 和 office梢褐,@Autowired 將分別尋找和它們類型匹配的 Bean旺遮,將它們作為 Boss(Car car ,Office office) 的入?yún)韯?chuàng)建 Boss Bean。

16.@Transactional的使用方法

http://www.cnblogs.com/yepei/p/4716112.html

http://blog.csdn.net/andyzhaojianhui/article/details/51984157

事務(wù)管理對于企業(yè)應(yīng)用來說是至關(guān)重要的盈咳,即使出現(xiàn)異常情況耿眉,它也可以保證數(shù)據(jù)的一致性。

注意:一般猪贪,保存的時候跷敬,Service需要把事物加上:

@Transactional(isolation=Isolation.DEFAULT, propagation=Propagation.REQUIRED, readonly=false)
public void saveCommonMsg(Msg msg) {

}

17.@SuppressWarnings可以抑制一些能通過編譯但是存在有可能運行異常的代碼會發(fā)出警告讯私,你確定代碼運行時不會出現(xiàn)警告提示的情況下热押,可以使用這個注釋。
("serial") 是序列化警告斤寇,當(dāng)實現(xiàn)了序列化接口的類上缺少serialVersionUID屬性的定義時桶癣,會出現(xiàn)黃色警告∧锼可以使用@SuppressWarnings將警告關(guān)閉

18.Transient

Hibernate的一個注解

@Transient表示該屬性并非一個到數(shù)據(jù)庫表的字段的映射,ORM框架將忽略該屬性.

//根據(jù)birth計算出age屬性
    @Transient
    public int getAge() {
    return getYear(new Date()) - getYear(birth);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末牙寞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子莫秆,更是在濱河造成了極大的恐慌间雀,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镊屎,死亡現(xiàn)場離奇詭異惹挟,居然都是意外死亡,警方通過查閱死者的電腦和手機缝驳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門连锯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來归苍,“玉大人,你說我怎么就攤上這事运怖∑雌” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵摇展,是天一觀的道長吻氧。 經(jīng)常有香客問我,道長咏连,這世上最難降的妖魔是什么医男? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮捻勉,結(jié)果婚禮上镀梭,老公的妹妹穿的比我還像新娘。我一直安慰自己踱启,他們只是感情好报账,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著埠偿,像睡著了一般透罢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冠蒋,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天羽圃,我揣著相機與錄音,去河邊找鬼抖剿。 笑死朽寞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斩郎。 我是一名探鬼主播脑融,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缩宜!你這毒婦竟也來了肘迎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤锻煌,失蹤者是張志新(化名)和其女友劉穎妓布,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宋梧,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡匣沼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了乃秀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肛著。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡圆兵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枢贿,到底是詐尸還是另有隱情殉农,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布局荚,位于F島的核電站超凳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏耀态。R本人自食惡果不足惜轮傍,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望首装。 院中可真熱鬧创夜,春花似錦、人聲如沸仙逻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽系奉。三九已至檬贰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缺亮,已是汗流浹背翁涤。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萌踱,地道東北人葵礼。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像虫蝶,于是被迫代替她去往敵國和親章咧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理能真,服務(wù)發(fā)現(xiàn),斷路器扰柠,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,778評論 6 342
  • 轉(zhuǎn)載鏈接 使用Spring2.5的新特性--Autowired可以實現(xiàn)快速的自動注入粉铐,而無需在xml文檔里面添加b...
    于謙大爺閱讀 643評論 0 4
  • 1- IOC的概念 IOC:也即控制反轉(zhuǎn),DI即依賴注入卤档,控制反轉(zhuǎn)IOC和依賴注入DI其實就是同個概念的兩個不同...
    zhanglbjames閱讀 3,005評論 1 3
  • 來源:關(guān)于Spring IOC (DI-依賴注入)你需要知道的一切作者:zejian Dao層(AccountDa...
    楊井閱讀 5,329評論 0 27