EricGu's Java-Record-Space

          專注 學習 實踐 創新

          2010年12月14日

               遇到System.Data.OracleClient 需要 Oracle 客戶端軟件 8.1.7 或更高版本。一般第一反映都是會出處理  oracle_home 文件夾權限。可是有時時候 不管你怎么擺弄權限,怎么iisreset,怎么重啟電腦都解決不了,cmd  path 明明可以看到有oracle_home 路徑啊。問題在于。環境變量中, ora10gInstant 精簡客戶端默認把變量添加到 Administrator 的用戶變量了,我們要做的是把  用戶變量中的 Path 值 轉到 系統變量中的 Path 中。
          posted @ 2012-04-19 13:09 Eric Gu 閱讀(444) | 評論 (0)編輯 收藏

          在項目中使用Spring的注解,關于spring的注解,由兩種注解方式,

          基于注釋(Annotation)的配置有越來越流行的趨勢,Spring 2.5 順應這種趨勢,提供了完全基于注釋配置 Bean、裝配 Bean 的功能,您可以使用基于注釋的 Spring IoC 替換原來基于 XML 的配置。本文通過實例詳細講述了 Spring 2.5 基于注釋 IoC 功能的使用。

          <!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->

          概述

          注釋配置相對于 XML 配置具有很多的優勢:

          • 它可以充分利用 Java 的反射機制獲取類結構信息,這些信息可以有效減少配置的工作。如使用 JPA 注釋配置 ORM 映射時,我們就不需要指定 PO 的屬性名、類型等信息,如果關系表字段和 PO 屬性名、類型都一致,您甚至無需編寫任務屬性映射信息——因為這些信息都可以通過 Java 反射機制獲取。
          • 注釋和 Java 代碼位于一個文件中,而 XML 配置采用獨立的配置文件,大多數配置信息在程序開發完成后都不會調整,如果配置信息和 Java 代碼放在一起,有助于增強程序的內聚性。而采用獨立的 XML 配置文件,程序員在編寫一個功能時,往往需要在程序文件和配置文件中不停切換,這種思維上的不連貫會降低開發效率。

          因此在很多情況下,注釋配置比 XML 配置更受歡迎,注釋配置有進一步流行的趨勢。Spring 2.5 的一大增強就是引入了很多注釋類,現在您已經可以使用注釋配置完成大部分 XML 配置的功能。在這篇文章里,我們將向您講述使用注釋進行 Bean 定義和依賴注入的內容。

           

           

           

          使用 @Autowired 注釋

          Spring 2.5 引入了 @Autowired 注釋,它可以對類成員變量、方法及構造函數進行標注,完成自動裝配的工作。

          Spring 通過一個 BeanPostProcessor@Autowired 進行解析,所以要讓 @Autowired 起作用必須事先在 Spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。

           

           

          在Spring中配置如下:

          <!-- 該 BeanPostProcessor 將自動起作用,對標注 @Autowired 的 Bean 進行自動注入 -->
              <bean class="org.springframework.beans.factory.annotation.
                  AutowiredAnnotationBeanPostProcessor"/>
          當 Spring 容器啟動時,AutowiredAnnotationBeanPostProcessor 將掃描 Spring 容器中所有 Bean,當發現 Bean 中擁有 @Autowired 注釋時就找到和其匹配(默認按類型匹配)的 Bean,并注入到對應的地方中去。

          按照上面的配置,Spring 將直接采用 Java 反射機制對 Boss 中的 caroffice 這兩個私有成員變量進行自動注入。所以對成員變量使用 @Autowired 后,您大可將它們的 setter 方法(setCar()setOffice())從 Boss 中刪除。

          當然,您也可以通過 @Autowired 對方法或構造函數進行標注,

           

          當候選 Bean 數目不為 1 時的應對方法

          在默認情況下使用 @Autowired 注釋進行自動注入時,Spring 容器中匹配的候選 Bean 數目必須有且僅有一個。當找不到一個匹配的 Bean 時,Spring 容器將拋出 BeanCreationException 異常,并指出必須至少擁有一個匹配的 Bean。

           

          當不能確定 Spring 容器中一定擁有某個類的 Bean 時,可以在需要自動注入該類 Bean 的地方可以使用 @Autowired(required = false),這等于告訴 Spring:在找不到匹配 Bean 時也不報錯。

           

          一般情況下,使用 @Autowired 的地方都是需要注入 Bean 的,使用了自動注入而又允許不注入的情況一般僅會在開發期或測試期碰到(如為了快速啟動 Spring 容器,僅引入一些模塊的 Spring 配置文件),所以 @Autowired(required = false) 會很少用到。

          和找不到一個類型匹配 Bean 相反的一個錯誤是:如果 Spring 容器中擁有多個候選 Bean,Spring 容器在啟動時也會拋出 BeanCreationException 異常。

           

          Spring 允許我們通過 @Qualifier 注釋指定注入 Bean 的名稱,這樣歧義就消除了,可以通過下面的方法解決異常:


          清單 13. 使用 @Qualifier 注釋指定注入 Bean 的名稱

                      @Autowired
                      public void setOffice(@Qualifier("office")Office office) {
                      this.office = office;
                      }
                      

          @Qualifier("office") 中的 office 是 Bean 的名稱,所以 @Autowired@Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName 了。@Autowired 可以對成員變量、方法以及構造函數進行注釋,而 @Qualifier 的標注對象是成員變量、方法入參、構造函數入參。正是由于注釋對象的不同,所以 Spring 不將 @Autowired@Qualifier 統一成一個注釋類。下面是對成員變量和構造函數入參進行注釋的代碼:

          對成員變量進行注釋:

           

          對成員變量使用 @Qualifier 注釋

                      public class Boss {
                      @Autowired
                      private Car car;
                      @Autowired
                      @Qualifier("office")
                      private Office office;
                      …
                      }
                      

          對構造函數入參進行注釋:


          清單 15. 對構造函數變量使用 @Qualifier 注釋

                      public class Boss {
                      private Car car;
                      private Office office;
                      @Autowired
                      public Boss(Car car , @Qualifier("office")Office office){
                      this.car = car;
                      this.office = office ;
                      }
                      }
                      

          @Qualifier 只能和 @Autowired 結合使用,是對 @Autowired 有益的補充。一般來講,@Qualifier 對方法簽名中入參進行注釋會降低代碼的可讀性,而對成員變量注釋則相對好一些。

           

          使用 JSR-250 的注釋

          Spring 不但支持自己定義的 @Autowired 的注釋,還支持幾個由 JSR-250 規范定義的注釋,它們分別是 @Resource@PostConstruct 以及 @PreDestroy

          @Resource

          @Resource 的作用相當于 @Autowired,只不過 @Autowired 按 byType 自動注入,面 @Resource 默認按 byName 自動注入罷了。@Resource 有兩個屬性是比較重要的,分別是 name 和 type,Spring 將 @Resource 注釋的 name 屬性解析為 Bean 的名字,而 type 屬性則解析為 Bean 的類型。所以如果使用 name 屬性,則使用 byName 的自動注入策略,而使用 type 屬性時則使用 byType 自動注入策略。如果既不指定 name 也不指定 type 屬性,這時將通過反射機制使用 byName 自動注入策略。

          Resource 注釋類位于 Spring 發布包的 lib/j2ee/common-annotations.jar 類包中,因此在使用之前必須將其加入到項目的類庫中。來看一個使用 @Resource 的例子:


          清單 16. 使用 @Resource 注釋的 Boss.java

                      package com.baobaotao;
                      import javax.annotation.Resource;
                      public class Boss {
                      // 自動注入類型為 Car 的 Bean
                      @Resource
                      private Car car;
                      // 自動注入 bean 名稱為 office 的 Bean
                      @Resource(name = "office")
                      private Office office;
                      }
                      

          一般情況下,我們無需使用類似于 @Resource(type=Car.class) 的注釋方式,因為 Bean 的類型信息可以通過 Java 反射從代碼中獲取。

          要讓 JSR-250 的注釋生效,除了在 Bean 類中標注這些注釋外,還需要在 Spring 容器中注冊一個負責處理這些注釋的 BeanPostProcessor

           

          <bean
                      class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
                      

          CommonAnnotationBeanPostProcessor 實現了 BeanPostProcessor 接口,它負責掃描使用了 JSR-250 注釋的 Bean,并對它們進行相應的操作。

          @PostConstruct 和 @PreDestroy

          Spring 容器中的 Bean 是有生命周期的,Spring 允許在 Bean 在初始化完成后以及 Bean 銷毀前執行特定的操作,您既可以通過實現 InitializingBean/DisposableBean 接口來定制初始化之后 / 銷毀之前的操作方法,也可以通過 <bean> 元素的 init-method/destroy-method 屬性指定初始化之后 / 銷毀之前調用的操作方法。關于 Spring 的生命周期,筆者在《精通 Spring 2.x—企業應用開發精解》第 3 章進行了詳細的描述,有興趣的讀者可以查閱。

          JSR-250 為初始化之后/銷毀之前方法的指定定義了兩個注釋類,分別是 @PostConstruct 和 @PreDestroy,這兩個注釋只能應用于方法上。標注了 @PostConstruct 注釋的方法將在類實例化后調用,而標注了 @PreDestroy 的方法將在類銷毀之前調用。


          清單 17. 使用 @PostConstruct 和 @PreDestroy 注釋的 Boss.java

                      package com.baobaotao;
                      import javax.annotation.Resource;
                      import javax.annotation.PostConstruct;
                      import javax.annotation.PreDestroy;
                      public class Boss {
                      @Resource
                      private Car car;
                      @Resource(name = "office")
                      private Office office;
                      @PostConstruct
                      public void postConstruct1(){
                      System.out.println("postConstruct1");
                      }
                      @PreDestroy
                      public void preDestroy1(){
                      System.out.println("preDestroy1");
                      }
                      …
                      }
                      

          您只需要在方法前標注 @PostConstruct@PreDestroy,這些方法就會在 Bean 初始化后或銷毀之前被 Spring 容器執行了。

          我們知道,不管是通過實現 InitializingBean/DisposableBean 接口,還是通過 <bean> 元素的 init-method/destroy-method 屬性進行配置,都只能為 Bean 指定一個初始化 / 銷毀的方法。但是使用 @PostConstruct@PreDestroy 注釋卻可以指定多個初始化 / 銷毀方法,那些被標注 @PostConstruct@PreDestroy 注釋的方法都會在初始化 / 銷毀時被執行。

          通過以下的測試代碼,您將可以看到 Bean 的初始化 / 銷毀方法是如何被執行的:


          清單 18. 測試類代碼

                      package com.baobaotao;
                      import org.springframework.context.support.ClassPathXmlApplicationContext;
                      public class AnnoIoCTest {
                      public static void main(String[] args) {
                      String[] locations = {"beans.xml"};
                      ClassPathXmlApplicationContext ctx =
                      new ClassPathXmlApplicationContext(locations);
                      Boss boss = (Boss) ctx.getBean("boss");
                      System.out.println(boss);
                      ctx.destroy();// 關閉 Spring 容器,以觸發 Bean 銷毀方法的執行
                      }
                      }
                      

          這時,您將看到標注了 @PostConstructpostConstruct1() 方法將在 Spring 容器啟動時,創建 Boss Bean 的時候被觸發執行,而標注了 @PreDestroy 注釋的 preDestroy1() 方法將在 Spring 容器關閉前銷毀 Boss Bean 的時候被觸發執行。





          回頁首

          使用 <context:annotation-config/> 簡化配置

          Spring 2.1 添加了一個新的 context 的 Schema 命名空間,該命名空間對注釋驅動、屬性文件引入、加載期織入等功能提供了便捷的配置。我們知道注釋本身是不會做任何事情的,它僅提供元數據信息。要使元數據信息真正起作用,必須讓負責處理這些元數據的處理器工作起來。

          而我們前面所介紹的 AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor 就是處理這些注釋元數據的處理器。但是直接在 Spring 配置文件中定義這些 Bean 顯得比較笨拙。Spring 為我們提供了一種方便的注冊這些 BeanPostProcessor 的方式,這就是 <context:annotation-config/>。請看下面的配置:


          清單 19. 調整 beans.xml 配置文件

                      <?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:annotation-config/>
                      <bean id="boss" class="com.baobaotao.Boss"/>
                      <bean id="office" class="com.baobaotao.Office">
                      <property name="officeNo" value="001"/>
                      </bean>
                      <bean id="car" class="com.baobaotao.Car" scope="singleton">
                      <property name="brand" value=" 紅旗 CA72"/>
                      <property name="price" value="2000"/>
                      </bean>
                      </beans>
                      

          <context:annotationconfig/> 將隱式地向 Spring 容器注冊 AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessorPersistenceAnnotationBeanPostProcessor 以及 equiredAnnotationBeanPostProcessor 這 4 個 BeanPostProcessor。

          在配置文件中使用 context 命名空間之前,必須在 <beans> 元素中聲明 context 命名空間。





          回頁首

          使用 @Component

          雖然我們可以通過 @Autowired@Resource 在 Bean 類中使用自動注入功能,但是 Bean 還是在 XML 文件中通過 <bean> 進行定義 —— 也就是說,在 XML 配置文件中定義 Bean,通過 @Autowired@Resource 為 Bean 的成員變量、方法入參或構造函數入參提供自動注入的功能。能否也通過注釋定義 Bean,從 XML 配置文件中完全移除 Bean 定義的配置呢?答案是肯定的,我們通過 Spring 2.5 提供的 @Component 注釋就可以達到這個目標了。

          下面,我們完全使用注釋定義 Bean 并完成 Bean 之間裝配:


          清單 20. 使用 @Component 注釋的 Car.java

                      package com.baobaotao;
                      import org.springframework.stereotype.Component;
                      @Component
                      public class Car {
                      …
                      }
                      

          僅需要在類定義處,使用 @Component 注釋就可以將一個類定義了 Spring 容器中的 Bean。下面的代碼將 Office 定義為一個 Bean:


          清單 21. 使用 @Component 注釋的 Office.java

                      package com.baobaotao;
                      import org.springframework.stereotype.Component;
                      @Component
                      public class Office {
                      private String officeNo = "001";
                      …
                      }
                      

          這樣,我們就可以在 Boss 類中通過 @Autowired 注入前面定義的 CarOffice Bean 了。


          清單 22. 使用 @Component 注釋的 Boss.java

                      package com.baobaotao;
                      import org.springframework.beans.factory.annotation.Autowired;
                      import org.springframework.beans.factory.annotation.Required;
                      import org.springframework.beans.factory.annotation.Qualifier;
                      import org.springframework.stereotype.Component;
                      @Component("boss")
                      public class Boss {
                      @Autowired
                      private Car car;
                      @Autowired
                      private Office office;
                      …
                      }
                      

          @Component 有一個可選的入參,用于指定 Bean 的名稱,在 Boss 中,我們就將 Bean 名稱定義為“boss”。一般情況下,Bean 都是 singleton 的,需要注入 Bean 的地方僅需要通過 byType 策略就可以自動注入了,所以大可不必指定 Bean 的名稱。

          在使用 @Component 注釋后,Spring 容器必須啟用類掃描機制以啟用注釋驅動 Bean 定義和注釋驅動 Bean 自動注入的策略。Spring 2.5 對 context 命名空間進行了擴展,提供了這一功能,請看下面的配置:


          清單 23. 簡化版的 beans.xml

                      <?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.baobaotao"/>
                      </beans>
                      

          這里,所有通過 <bean> 元素定義 Bean 的配置內容已經被移除,僅需要添加一行 <context:component-scan/> 配置就解決所有問題了——Spring XML 配置文件得到了極致的簡化(當然配置元數據還是需要的,只不過以注釋形式存在罷了)。<context:component-scan/> 的 base-package 屬性指定了需要掃描的類包,類包及其遞歸子包中所有的類都會被處理。

          <context:component-scan/> 還允許定義過濾器將基包下的某些類納入或排除。Spring 支持以下 4 種類型的過濾方式,通過下表說明:


          表 1. 掃描過濾方式

          過濾器類型 說明
          注釋 假如 com.baobaotao.SomeAnnotation 是一個注釋類,我們可以將使用該注釋的類過濾出來。
          類名指定 通過全限定類名進行過濾,如您可以指定將 com.baobaotao.Boss 納入掃描,而將 com.baobaotao.Car 排除在外。
          正則表達式 通過正則表達式定義過濾的類,如下所示: com\.baobaotao\.Default.*
          AspectJ 表達式 通過 AspectJ 表達式定義過濾的類,如下所示: com. baobaotao..*Service+

          下面是一個簡單的例子:

           

          <context:component-scan base-package="com.baobaotao">
                      <context:include-filter type="regex"
                      expression="com\.baobaotao\.service\..*"/>
                      <context:exclude-filter type="aspectj"
                      expression="com.baobaotao.util..*"/>
                      </context:component-scan>
                      

          值得注意的是 <context:component-scan/> 配置項不但啟用了對類包進行掃描以實施注釋驅動 Bean 定義的功能,同時還啟用了注釋驅動自動注入的功能(即還隱式地在內部注冊了 AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor),因此當使用 <context:component-scan/> 后,就可以將 <context:annotation-config/> 移除了。

          默認情況下通過 @Component 定義的 Bean 都是 singleton 的,如果需要使用其它作用范圍的 Bean,可以通過 @Scope 注釋來達到目標,如以下代碼所示:


          清單 24. 通過 @Scope 指定 Bean 的作用范圍

                      package com.baobaotao;
                      import org.springframework.context.annotation.Scope;
                      …
                      @Scope("prototype")
                      @Component("boss")
                      public class Boss {
                      …
                      }
                      

          這樣,當從 Spring 容器中獲取 boss Bean 時,每次返回的都是新的實例了。





          回頁首

          采用具有特殊語義的注釋

          Spring 2.5 中除了提供 @Component 注釋外,還定義了幾個擁有特殊語義的注釋,它們分別是:@Repository@Service@Controller。在目前的 Spring 版本中,這 3 個注釋和 @Component 是等效的,但是從注釋類的命名上,很容易看出這 3 個注釋分別和持久層、業務層和控制層(Web 層)相對應。雖然目前這 3 個注釋和 @Component 相比沒有什么新意,但 Spring 將在以后的版本中為它們添加特殊的功能。所以,如果 Web 應用程序采用了經典的三層分層結構的話,最好在持久層、業務層和控制層分別采用 @Repository@Service@Controller 對分層中的類進行注釋,而用 @Component 對那些比較中立的類進行注釋。





          回頁首

          注釋配置和 XML 配置的適用場合

          是否有了這些 IOC 注釋,我們就可以完全摒除原來 XML 配置的方式呢?答案是否定的。有以下幾點原因:

          • 注釋配置不一定在先天上優于 XML 配置。如果 Bean 的依賴關系是固定的,(如 Service 使用了哪幾個 DAO 類),這種配置信息不會在部署時發生調整,那么注釋配置優于 XML 配置;反之如果這種依賴關系會在部署時發生調整,XML 配置顯然又優于注釋配置,因為注釋是對 Java 源代碼的調整,您需要重新改寫源代碼并重新編譯才可以實施調整。
          • 如果 Bean 不是自己編寫的類(如 JdbcTemplateSessionFactoryBean 等),注釋配置將無法實施,此時 XML 配置是唯一可用的方式。
          • 注釋配置往往是類級別的,而 XML 配置則可以表現得更加靈活。比如相比于 @Transaction 事務注釋,使用 aop/tx 命名空間的事務配置更加靈活和簡單。

          所以在實現應用中,我們往往需要同時使用注釋配置和 XML 配置,對于類級別且不會發生變動的配置可以優先考慮注釋配置;而對于那些第三方類以及容易發生調整的配置則應優先考慮使用 XML 配置。Spring 會在具體實施 Bean 創建和 Bean 注入之前將這兩種配置方式的元信息融合在一起。





          回頁首

          小結

          Spring 在 2.1 以后對注釋配置提供了強力的支持,注釋配置功能成為 Spring 2.5 的最大的亮點之一。合理地使用 Spring 2.5 的注釋配置,可以有效減少配置的工作量,提高程序的內聚性。但是這并不意味著傳統 XML 配置將走向消亡,在第三方類 Bean 的配置,以及那些諸如數據源、緩存池、持久層操作模板類、事務管理等內容的配置上,XML 配置依然擁有不可替代的地位。

          posted @ 2010-12-15 14:40 Eric Gu 閱讀(276) | 評論 (0)編輯 收藏

          什么叫控制反轉呢?套用好萊塢的一句名言就是:你呆著別動,到時我會找你。
          什么意思呢?就好比一個皇帝和太監
          有一天皇帝想寵幸某個美女,于是跟太監說,今夜我要寵幸美女
          皇帝往往不會告訴太監,今晚幾點會回宮,會回哪張龍床,他只會告訴太監他要哪位美女

          其它一切都交由太監去安排,到了晚上皇帝回宮時,自然會有美女出現在皇帝的龍床上
          這就是控制反轉,而把美女送到皇帝的寢宮里面去就是注射

          太監就是是框架里面的注射控制器類BeanFactory,負責找到美女并送到龍床上去
          整個后宮可以看成是Spring框架,美女就是Spring控制下的JavaBean
          而傳統的模式就是一個饑渴男去找小姐出臺
          找領班,幫助給介紹一個云云,于是領班就開始給他張羅
          介紹一個合適的給他,完事后,再把小姐還給領班,下次再來

          這個過程中,領班就是查詢上下文Context,領班的一個職能就是給客戶找到他們所要的小姐
          這就是lookup()方法,領班手中的小姐名錄就是JNDI//Java Naming and Directory Interface
          小姐就是EJB饑渴男是客戶端青樓是EJB容器
          看到區別了么?

          饑渴男去找小姐出臺很麻煩,不僅得找,用完后還得把小姐給還回去

          而皇帝爽翻了,什么都不用管,交給太監去處理,控制權轉移到太監手中去了而不是皇帝,

          必要時候由太監給注射進去就可以了


          posted @ 2010-12-15 11:39 Eric Gu 閱讀(1000) | 評論 (0)編輯 收藏
          /**
           *
           * @author liuguangyi
           * @content  ejb3注解的API定義在javax.persistence.*包里面。
           *
           * 注釋說明:
           * @Entity —— 將一個類聲明為一個實體bean(即一個持久化POJO類)
           * @Id —— 注解聲明了該實體bean的標識屬性(對應表中的主鍵)。
           * @Table —— 注解聲明了該實體bean映射指定的表(table),目錄(catalog)和schema的名字
           * @Column —— 注解聲明了屬性到列的映射。該注解有如下的屬性
           *  name  可選,列名(默認值是屬性名)
           *  unique 可選,是否在該列上設置唯一約束(默認值false)
           *  nullable 可選,是否設置該列的值可以為空(默認值false)
           *  insertable 可選,該列是否作為生成的insert語句中的一個列(默認值true)
           *  updatable 可選,該列是否作為生成的update語句中的一個列(默認值true)
           *  columnDefinition 可選,為這個特定列覆蓋sql ddl片段(這可能導致無法在不同數據庫間移植)
           *  table 可選,定義對應的表(默認為主表)
           *  length 可選,列長度(默認值255)
           *  precision 可選,列十進制精度(decimal precision)(默認值0)
           *  scale 可選,如果列十進制數值范圍(decimal scale)可用,在此設置(默認值0)
           * @GeneratedValue —— 注解聲明了主鍵的生成策略。該注解有如下屬性
           *  strategy 指定生成的策略(JPA定義的),這是一個GenerationType。默認是GenerationType. AUTO
           *   GenerationType.AUTO 主鍵由程序控制
           *   GenerationType.TABLE 使用一個特定的數據庫表格來保存主鍵
           *   GenerationType.IDENTITY 主鍵由數據庫自動生成(主要是自動增長類型)
           *   GenerationType.SEQUENCE 根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。(這個值要與generator一起使用)
           *  generator 指定生成主鍵使用的生成器(可能是orcale中的序列)。
           * @SequenceGenerator —— 注解聲明了一個數據庫序列。該注解有如下屬性
           *  name 表示該表主鍵生成策略名稱,它被引用在@GeneratedValue中設置的“gernerator”值中
           *  sequenceName 表示生成策略用到的數據庫序列名稱。
           *  initialValue 表示主鍵初始值,默認為0.
           *  allocationSize 每次主鍵值增加的大小,例如設置成1,則表示每次創建新記錄后自動加1,默認為50.
           * @GenericGenerator —— 注解聲明了一個hibernate的主鍵生成策略。支持十三種策略。該注解有如下屬性
           *  name 指定生成器名稱
           *  strategy 指定具體生成器的類名(指定生成策略)。
           *  parameters 得到strategy指定的具體生成器所用到的參數。
           *    其十三種策略(strategy屬性的值)如下:
           *   1.native 對于orcale采用Sequence方式,對于MySQL和SQL Server采用identity(處境主鍵生成機制),
           *     native就是將主鍵的生成工作將由數據庫完成,hibernate不管(很常用)
           *     例:@GeneratedValue(generator = "paymentableGenerator")   
           *          @GenericGenerator(name = "paymentableGenerator", strategy = "native")
           *      2.uuid 采用128位的uuid算法生成主鍵,uuid被編碼為一個32位16進制數字的字符串。占用空間大(字符串類型)。
           *       例:@GeneratedValue(generator = "paymentableGenerator")   
           *          @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
           *      3.hilo 要在數據庫中建立一張額外的表,默認表名為hibernate_unque_key,默認字段為integer類型,名稱是next_hi(比較少用)
           *       例:@GeneratedValue(generator = "paymentableGenerator")   
           *          @GenericGenerator(name = "paymentableGenerator", strategy = "hilo")
           *      4.assigned 在插入數據的時候主鍵由程序處理(很常用),這是<generator>元素沒有指定時的默認生成策略。等同于JPA中的AUTO。
           *       例:@GeneratedValue(generator = "paymentableGenerator")   
           *          @GenericGenerator(name = "paymentableGenerator", strategy = "assigned")
           *      5.identity 使用SQL Server和MySQL的自增字段,這個方法不能放到Oracle中,Oracle不支持自增字段,要設定sequence(MySQL和SQL Server中很常用)。等同于JPA中的IDENTITY
           *       例:@GeneratedValue(generator = "paymentableGenerator")   
           *          @GenericGenerator(name = "paymentableGenerator", strategy = "identity")
           *      6.select 使用觸發器生成主鍵(主要用于早期的數據庫主鍵生成機制,少用)
           *       例:@GeneratedValue(generator = "paymentableGenerator")   
           *          @GenericGenerator(name = "paymentableGenerator", strategy = "select")
           *      7.sequence 調用謹慎數據庫的序列來生成主鍵,要設定序列名,不然hibernate無法找到。
           *       例:@GeneratedValue(generator = "paymentableGenerator")  
           *   @GenericGenerator(name = "paymentableGenerator", strategy = "sequence",   
           *    parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })
           *  8.seqhilo 通過hilo算法實現,但是主鍵歷史保存在Sequence中,適用于支持Sequence的數據庫,如Orcale(比較少用)
           *  例:@GeneratedValue(generator = "paymentableGenerator")  
           *    @GenericGenerator(name = "paymentableGenerator", strategy = "seqhilo",   
           *    parameters = { @Parameter(name = "max_lo", value = "5") })
           *  9.increnment 插入數據的時候hibernate會給主鍵添加一個自增的主鍵,但是一個hibernate實例就維護一個計數器,所以在多個實例運行的時候不能使用這個方法。
           *   例:@GeneratedValue(generator = "paymentableGenerator")   
           *          @GenericGenerator(name = "paymentableGenerator", strategy = "increnment")
           *      10.foreign 使用另一個相關的對象的主鍵。通常和<one-to-one>聯合起來使用。
           *      例:@Id   
           *    @GeneratedValue(generator = "idGenerator")  
           *    @GenericGenerator(name = "idGenerator", strategy = "foreign",   
           *         parameters = { @Parameter(name = "property", value = "info") })   
           *    Integer id;
           *   @OneToOne 
           *   EmployeeInfo info;
           *  11.guid 采用數據庫底層的guid算法機制,對應MySQL的uuid()函數,SQL Server的newid()函數,ORCALE的rawtohex(sys_guid())函數等
           *  例:@GeneratedValue(generator = "paymentableGenerator")    
           *    @GenericGenerator(name = "paymentableGenerator", strategy = "guid")
           *  12.uuid.hex 看uudi,建議用uuid替換
           *    例:@GeneratedValue(generator = "paymentableGenerator")    
           *    @GenericGenerator(name = "paymentableGenerator", strategy = "uuid.hex")
           *  13.sequence-identity sequence策略的擴展,采用立即檢索策略來獲取sequence值,需要JDBC3.0和JDK4以上(含1.4)版本
           *       例:@GeneratedValue(generator = "paymentableGenerator")  
           *   @GenericGenerator(name = "paymentableGenerator", strategy = "sequence-identity",   
           *         parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") }) 
           *     
           * @OneToOne 設置一對一個關聯。cascade屬性有五個值(只有CascadeType.ALL好用?很奇怪),分別是CascadeType.PERSIST(級聯新建),CascadeType.REMOVE(級聯刪除),CascadeType.REFRESH(級聯刷新),CascadeType.MERGE(級聯更新),CascadeType.ALL(全部四項)
           *    方法一
           *     主表: ?@OneToOne(cascade = CascadeType.ALL)
           *      @PrimaryKeyJoinColumn
           *      public 從表類 get從表類(){return 從表對象}
           *      從表:沒有主表類。
           *      注意:這種方法要求主表與從表的主鍵值想對應。
           *   方法二
           *      主表:?@OneToOne(cascade = CascadeType.ALL)
           *          @JoinColumn(name="主表外鍵") //這里指定的是數據庫中的外鍵字段。
           *          public 從表類 get從表類(){return 從表類}
           *      從表:@OneToOne(mappedBy = "主表類中的從表屬性")//例主表User中有一個從表屬性是Heart類型的heart,這里就填heart
           *          public 主表類 get主表類(){return 主表對象}
           *      注意:@JoinColumn是可選的。默認值是從表變量名+"_"+從表的主鍵(注意,這里加的是主鍵。而不是主鍵對應的變量)。
           * 方法三
           *      主表:@OneToOne(cascade=CascadeType.ALL)
           *          @JoinTable( name="關聯表名",
           *    joinColumns = @JoinColumn(name="主表外鍵"),
           *    inverseJoinColumns = @JoinColumns(name="從表外鍵")
           *          )
           *      從表:@OneToOne(mappedBy = "主表類中的從表屬性")//例主表User中有一個從表屬性是Heart類型的heart,這里就填heart
           *          public 主表類 get主表類(){return 主表對象}   
           *  @ManyToOne 設置多對一關聯
           *    方法一      
           *    @ManyToOne(cascade={CasCadeType.PERSIST,CascadeType.MERGE})
           *    @JoinColumn(name="外鍵")
           *    public 主表類 get主表類(){return 主表對象}
           *    方法二
           *    @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
           *    @JoinTable(name="關聯表名",
           *     joinColumns = @JoinColumn(name="主表外鍵"),
           *     inverseJoinColumns = @JoinColumns(name="從表外鍵")
           *    )
           *  @OneToMany 設置一對多關聯。cascade屬性指定關聯級別,參考@OneToOne中的說明。fetch指定是否延遲加載,值為FetchType.LAZY表示延遲,為FetchType.EAGER表示立即加載
           *    方法一     使用這種配置,在為“一端”添加“多端”時,不會修改“多端”的外鍵。在“一端”加載時,不會得到“多端”。如果使用延遲加載,在讀“多端”列表時會出異常,立即加載在得到多端時,是一個空集合(集合元素為0)。
           *    “一端”配置
           *    @OneToMany(mappedBy="“多端”的屬性")
           *    public List<“多端”類> get“多端”列表(){return “多端”列表}
           *    “多端”配置參考@ManyToOne.    
           *    方法二
           *    “一端”配置
           *    @OneToMany(mappedBy="“多端”的屬性")
           *    @MapKey(name="“多端”做為Key的屬性")
           *    public Map<“多端”做為Key的屬性的類,主表類> get“多端”列表(){return “多端”列表}
           *    “多端”配置參考@ManyToOne.
           *    方法三 使用這種配置,在為“一端”添加“多端”時,可以修改“多端”的外鍵。
           *    “一端”配置
           *    @OneToMany
           *    @JoinColumn(name="“多端”外鍵")
           *    public List<“多端”類> get“多端”列表(){return “多端”列表}
           *    “多端”配置參考@ManyToOne.    
           *   
           *  
           */
          posted @ 2010-12-14 15:31 Eric Gu 閱讀(3106) | 評論 (0)編輯 收藏

          導航

          <2010年12月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 库车县| 简阳市| 黔西县| 石泉县| 东乌| 宁南县| 探索| 新昌县| 淄博市| 仪陇县| 会东县| 吴旗县| 镶黄旗| 嘉禾县| 湛江市| 宁远县| 宝坻区| 中超| 石屏县| 芦山县| 分宜县| 太湖县| 邢台县| 南宁市| 武穴市| 漳浦县| 隆尧县| 肇庆市| 赤城县| 伊吾县| 广昌县| 永清县| 江永县| 平谷区| 镇平县| 崇州市| 长治县| 穆棱市| 淮滨县| 南雄市| 天柱县|