亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

EJB 3.0簡介

2019-11-18 16:13:01
字體:
來源:轉載
供稿:網友

1 簡化開發的目標

1.1我們的目標

EJB3.0是當前很多人談論的話題,企業軟件開發的一個關鍵是,提供一個盡量簡單的的應用框架:它可以使開發人員不用關注于復雜的問題,比如事務處理、安全和持久化等??梢约芯﹃P注于商業邏輯,而不用關心那些低層的技術細節,從而提高開發者的效率,得到高質量的軟件。這也是制定EJB 3.0規范的目標,簡化開發!


1.2 當前的問題


EJB3.0希望開發人員能夠從這種新的開發模式中受益,更好地推進J2EE的應用. 隨著java不斷的進步和發展,越來越多的企業選擇J2EE作為它們的解決方案,J2EE體系結構提供一個簡化的中間層集成框架來滿足應用的需求。然而,對于一般的開發人員,目前J2EE 1.4下的EJB 2.1 框架有些過于復雜了。 按照EJB2.1規范的定義,EJB組件必須事先很多的接口, 比如Home接口、Remote接口、local 接口,等等.還要針對各種應用類型定義許多的xml描述文件。當我們需要訪問某個組件或者服務的時候,必須通過JDNI查找,通過名字綁定服務,才能找到我們需要的對象。

比如我們要使用某個EJB shopping cart, 就要首先實現一個initial context,然后通過他查找這個EJB 的home 接口,然后調用home街口的create方法,得到一個EJB object, 最后調用這個EJB object的商務方法. 下面是一個例子:
// EJB 2.1 Client view of the ShoppingCart Bean
...
Context initialContext = new InitialContext();
ShoppingCartHome myCartHome = (ShoppingCartHome)
initialContext.lookup(“JAVA:comp/env/ejb/cart”);
ShoppingCart myCart= myCartHome.create();
//Use the Bean
Collection widgets = myCart.startToShop(Widgets )
...
// Don't forget code to handle JAVAx.ejb.CreateException
...
EJB2.1的規范還要求我們必須實現Javax.EJB里面定義的接口, 實現里面的Methods比如 EJBCreate(), EJBPassivate(), and EJBActivate()。大多數情況下這些方法是不需要開發人員作任何修改的。這些規定實際上都和真正核心的商務邏輯沒什么關系,都只是一些技術模板,規定了開發人員必須按照這樣的模板進行開發. 比如下面這段代碼:

人們開始思考,怎么樣才能把EJB的開發變的更加簡單,更好的利用這種技術. 當前正在制定的EJB 3.0的標準的目標就是簡化開發, 讓更多的開發人員被它的易用和強大功能所吸引過來,喜愛這項技術。為了達到這個目標,要做的第一件事情,也是最重要的事情,就是從一個開發人員的角度,將EJB的使用盡量的簡化。

1.3 JCP專家組的工作


這個工作是由EJB3.0 專家組來完成的。我們知道JAVA的開發和推動是由一個開放的組織來完成的,這個組織的名字叫做JAVA Community PRocess。簡稱JCP. SUN的理念是: 創新無處不在. 所以JCP小組從世界的每個角落聽取關于JAVA的建議,將各方面對JAVA的要求通過制定JSR(JAVA Specification Request )形式確定下來. EJB 3.0規范的JSR編號是 220. 整個專家組的制定成員包括J2EE 注冊用戶, 應用服務器的開發廠商和J2EE社區的成員.


簡化一個現有的技術,尤其是得到廣泛的開發人支持的技術,比如EJB, 不是一個簡單的工作. 作為鋪墊,專家組進行了大量的準備工作,檢驗了EJB技術的復雜性,當前EJB流域流行的各種模式和反模式,以及從客戶和開發人員來的各種需求。開發人員和用戶根據實際的需要,希望EJB能夠提供他們滿意的特性.
檢驗結果發現,大多數情況下,人們不需要更高級的技術,而是需要更簡化的技術,來簡化當前的開發模式。而不是像以前的EJB發布一樣,在技術復雜度上的提高。定義一個新技術,不僅對老的技術有一定的更新, 也要能充分并容老的技術, 提供一定的向后兼容性. 因為采用這些技術的企業,已經在這些技術上投資了很多. 如果因為技術的更新就使得對應的IT系統和數據變得不能使用,是一件非常糟糕的事情.


所以,定義了EJB3.0規范的同時,如何支持現有的EJB技術是非常必要的. 要保證現有的EJB API是持續可用的, 還要和新的EJB3.0 API結合起來, 對早期的API應該繼續提供支持而不是標記為不贊成使用

1.4 標注的新功能


EJB3.0的很多新特性是通過JAVA SE5.0來實現的。這里我們就要談到JAVA SE 5.0,它所提供的許多特性,其中最有趣的一點就是標注(Annotation)的功能。我們知道以前的JAVA語言都是命令格式的, 比如a.b(), 表示讓類a做事情b, 但是很多時候我們只是需要對某個對象做一些注解,比如對某個類標記為可持續化的Serializable. 這只是一個標記,為了以后的處理提供說明,本身不需要做任何操作。
在Deploy 的時候, 提供了很多說明的XML文件,比如部署描述文件,里面說明了引用的EJB的名字,接口, 以及當前EJB的Transaction Type等等信息. 所有這些信息都是說明性的,而不是命令性的. 用來對某個對象的某個屬性坐一段說明. 因此,有一個非常有趣的想法,能不能通過對JAVA語言的擴展,結合標注和命令這兩者的優點 ?



這也是有一個專家組在JCP的組織內完成的, JSR規范的編號是JSR 175, 為JAVA SE 5.0支持注解(Annotation)的功能. 這個規范為EJB3.0 的簡化實現提供了一些基本的支持, 也是最關鍵的支持. 標注可以有自己的屬性,也可以定義自己的持續時間,表示這段信息是否保存到 源代碼中,還是一直持續到Class中,或者一直保持到運行時間. 標注有自己的缺省值.大多數情況下,無須說明我們就可以推算出來這個對象的行為?!?br />2 輕松的實現開發

2.1 減輕開發人員的負擔

EJB3.0的簡化工作包括下面幾個部分:
 提供一個簡化的API, 包括對EJB的定義,對EJB的引用等等
 減少開發的類數目,不再需要那么多的interface
 相關性注入
 簡化的查詢機制
 從開發人員的角度不必要使用部署描述文件, 很多的工作可以放到代碼里面用標注來說明,比如Entity Bean 的Transaction Type
 簡化的持久化功能
 簡化和改善數據對象的O/R Mapping.


標注可以應用到編程語言的一些基本元素上,比如類,方法,變量,包等等. 當我們在代碼中使用了這些標注, 根據這個標注對應的持續策略, 它可以被編譯到Class 文件中去,或者一直保持到運行的時候。大多數在 EJB 3.0 中定義的標注都是Runtime保持策略, 這樣做的好處是提供了最大的靈活性。而且由于大量工作放到了運行的時候來做,也減少一部分Deploy的工作。


我們通過定義缺省的語法來說明大多數常見的情況。開發人員不需要再專門說明常見的情況,“OK, 沒問題,缺省的設置就已經可以滿足需要了“ 這樣,開發人員的工作大大減輕了。
這也引出來了EJB3.0中的一個很有意思的概念 "Configuration By Exception" --只有在例外的情況下才需要我們的參與.


EJB3.0的目標是簡化開發人員的工作,讓他們專注于商務應用的開發而不是把精力放到很多繁瑣的例行工作上,這些工作可以交給Container來完成。EJB通過注入來指定自己需要的資源,不用再寫那些麻煩的方法. 將對象的創建和獲取提取到外部。由外部容器提供需要的組件。這樣,開發人員只用在開始的時候定義,說我需要這個資源, 后面就可以直接使用這個資源, 這樣會大大的簡化開發, 因為開發人員只用關心如何使用這個對象和商務方法, 而不用擔心其他的技術細節。

2.2 拋開繁瑣的細節
下面我們看看都作了那些簡化。我們的目的是把那些繁瑣的技術細節隱藏起來,程序開發人員只用關心自己的商務邏輯代碼,而不用關心那些復雜的技術模板,必須實現的接口等,哪怕這些方法和接口根本不需要實現.

 不再需要EJB的部件接口
 每個EJB 都只是一個普通的JAVA Class
 不再需要home接口, 我們不再用home 來創建這個EJB
 不再需要實現javax.ejb.EnterpriseBean借口
 對于需要在回調方法里實現的部分,我們采用標注的方式說明一個方法為回調方法
 不再需要使用復雜的JNDI名字調用機制,對于需要服務或者資源的地方
 我們采用了相關性注入的方法,另外也可以通過簡化的lookup方法來查找資源

下面讓我們看一個簡單的無狀態sessionBean的例子。無狀態session Bean是最簡單也是最常用 Bean,很多初學EJB的人都從無狀態Session Bean開始。如何讓無狀態Session Bean 變的簡單易用成為一個非常有意義的話題。

前面假設我們已經定義了相關的interface, 這個EJB2.1的的功能是對員工的工資做處理,打開一個數據庫連接,進行員工工資信息的某些操作,等等.

// EJB 2.1
public Class PayrollBean implements JAVAx.ejb.SessionBean
{
SessionContext ctx;
DataSource empDB;
public void setSessionContext(SessionContext ctx) {
this.ctx = ctx;
}
public void ejbCreate() {
Context initialContext = new InitialContext();
empDB = (DataSource)initialContext.lookup( JAVA:comp/env/jdbc/empDB );
}
public void ejbActivate() {}
public void ejbPassivate() {}
public void ejbRemove() {}
public void setBenefitsDedUCtion (int empId, double deduction) {
...
Connection conn = empDB.getConnection();
...
}
...
}
// NOTE deployment descriptor needed


這里我們首先要實現一個 sessionBean interface,保持一個對sessioncontext的引用,然后是在EJBcreate 方法里面我們調用JNDI得到一個datasource。 后面我們必須要定義一些回調方法,雖然這些方法我們不會實現任何邏輯。然后在 商務方法里面,我們打開一個數據庫連接。


注意,我們還沒有完。為了使用這個EJB, 必須加上xml的部署描述文件打好包。

下面是一個常見的部署描述文件可以是這樣子的。

<session>
<ejb-name>PayrollBean</ejb-name>
<local-home>PayrollHome</local-home>
<local>Payroll</local>
<ejb-class>com.example.PayrollBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<resource-ref>
<res-ref-name>jdbc/empDB</res-ref-name>
<res-ref-type>javax.sql.DataSource</res-ref-type>
<res-auth>Container</res-auth>
</resource-ref>
</session>
...
<assembly-descriptor>
...
</assembly-descriptor>

從開發人員的角度來檢查這樣一個簡單的EJB 是非常有意義的。我們可以更好的理解有那些地方可以有改動。一個主要的問題是,定義了這么多的方法和結構以后,程序的清晰化受到了影響,結構變得混亂。真正需要關注的商務方法沒有很好的強調和體現。

下面讓我們看一看EJB 3.0 是如何實現一個簡單的stateless session Bean的。

// Same example, EJB 3.0
@Stateless public class PayrollBean implements Payroll {
@Resource DataSource empDB;
public void setBenefitsDeduction (int empId, double deduction) {
...
Connection conn = empDB.getConnection();
...
}
...
}


@Stateless 標注表示這是一個stateless session Bean. 使用這樣的標注可以讓我們不再需要使用SessionBean 接口, 這樣就大大的簡化了EJB的實現類。 Bean的商務接口是payroll. 這是一個普通的JAVA interface. 缺省的情況,container會把他作成一個local interface. 如果需要實現一個遠程接口,只需再定義一個標注 @Remote. 注意在接口里面不需要定義 RemoteExceptions,它由Container 層在后面處理掉了

2.3 引用對象的新方法
在老的EJB規范中,還有一個比較復雜的地方是訪問環境對象。EJB 2.1 里面訪問環境要首先在組件定義的相關性引用,比如resource-refs, EJB-refs, 然后在JNDI名字空間里面配置這些環境對象。 最后查找運行的時候JNDI空間里面查找這些環境對象
EJB 3.0對此提供了兩種簡化的方案:

1) 相關性注入
2) 一個簡化的查詢lookup方法

相關性注入是一種技術,開發人員在原代碼中加入標注的一個定義,說明需要這個環境對象,然后由Container在初始化的時候把真的環境對象注入里面。
目前EJB3.0 spec里面有兩種注入方式,setter注入和變量注入, 這些在以后的規范中可能會有變化,比如一種統一的注入方式。 我們可以通過注入標記@EJB來定義一個EJB的引用,也可以通過注入標記@resource 表示我們要引用一個資源,它可以是EJB以外的一切環境對象. 專家組為了盡可能的簡化開發,將使用注入的對象類型作了簡化。

EJB3.0 將仍然提供一個動態查詢的方法,但是從程序開發人員的角度,不需要再使用JNDI API,而是采用更為簡化的EJB Context 的 Lookup方法。

在新的EJB 3.0規范中,因為不再需要復雜的home接口和EJB 接口。EJB client端的編碼也大大的簡化了,和訪問一個普通的JAVA 對象沒有什么區別。上面的那個EJB2.1的例子比較起來,在EJB 3.0 里面使用一個EJB變的非常簡單,只需要兩行代碼:

// EJB 3.0 client view
@EJB ShoppingCart myCart;
...
Collection widgets = myCart.startToShop(Widgets );
...

首先定義一個EJB的應用,然后就可以直接調用這個EJB的商務方法,剩下的工作由Container來為我們完成。

2.4 新的事務管理

EJB中的事務(Transaction)管理大大簡化了用戶開發程序。把應用分成一個一個小的單元,叫做transaction. 事務系統保證了這個單元里面的任務是完整的,要么全部執行,要么出錯后完全退回到初始狀態。


J2EE中有兩種類型的事務, 容器管理的和Bean管理的。他們在如何啟動和結束事務上是不同的。Bean 管理的事務由組件使用 UserTransaction類顯式啟動和結束的。代碼中需要調用方法 UserTransaction.begin() 和 UserTransaction.commit() 。Container 管理的事物是由container 自動來完成的。
針對不同的事務類型,可以定義6種不同的事務屬性。
事務屬性告訴 Container 是否把EJB方法里面的工作放到用戶的事務里面。還是針對這個方法重新啟動一個新的事務. 或者執行這個方法而不包含在事務里面,等等。
在EJB3.0規范中,我們缺省的定義是容器管理的事務. 而且針對所有的Bean方法,應用Required Transaction屬性,它的意思是如果調用這個方法的應用沒有Transaction Environment,那么這個方法會自動創建一個新的。
開發人員可以使用標注的方式在針對整個EJB或者某個具體的方法指定他的Transaction Attribute.
首先我們看一個工資處理的EJB的例子, 這是一個標準的EJB 3.0 Stateless Session Bean。缺省情況下,每個方法是都是由container來管理Transaction的,缺省的事務屬性是required
// Uses container-managed transction, REQUIRED attribute
@Stateless public PayrollBean implements Payroll {
public void setBenefitsDeduction(int empId, double deduction) {...}
public double getBenefitsDeduction(int empId) {...}
public double getSalary(int empId) {...}
public void setSalary(int empId, double salary) {...}
}


下面還是這個例子,我們知道對于有關重要數據的改動,總是非常敏感的。比如我們在更改某個用戶的工資的時候同時修改他的所得稅,我們希望這兩個調用是在同一個Transaction里面發生的。

@Stateless public PayrollBean implements Payroll {
@TransactionAttribute(MANDATORY)
public void setBenefitsDeduction(int empId, double deduction) {...}
public double getBenefitsDeduction(int empId) {...}
public double getSalary(int empid) {...}
@TransactionAttribute(MANDATORY)
public void setSalary(int empId, double salary) {...}
}

那么調用用戶的工資改動的方法就必須在一個已經存在的Transaction Environment
中,為此,我們用@transactionattribute(mandatory)標注 這個方法必須在一個客戶端的transaction中,如果客戶端沒有這樣的一個 Transaction Context, Container會扔出來一個 Javax.ejb.EjBTransactionRequiredException 的錯誤信息。

2.5 新的安全機制
EJB架構不鼓勵開發人員用代碼的方式實現安全機制,而是采用安全角色的方法,通過定義可以訪問的安全角色,來限制對某個方法的訪問權限。

缺省情況,在3.0里面所有的方法都是"unchecked"。也就是說缺省情況下對所有方法是不用安全控制策略的。如果調用某個方法的客戶端具有某個用戶角色(Role) ,我們可以制定是否這個方法也是沿用這個角色。缺省情況下的安全策略是"Caller Identity",也就是說被調用者的角色和調用者的角色應該是一致的

這是一個EJB 3.0的安全實現的例子。我們對于其他的方法都沒有設定安全策略。但是對于設定某個員工的工資是多少,這樣的安全要求比較高的方法設定了只有人事部門的管理員才能調用。我們采用了一個

@RolesAllowed("HR_PayrollAdministrator ")
// Security view
@Stateless public PayrollBean implements Payroll {
public void setBenefitsDeduction(int empId, double deduction) {...}
public double getBenefitsDeduction(int empId) {...}
public double getSalary(int empid) {...}
// salary setting is intended to be more restricted
@RolesAllowed( HR_PayrollAdministrator )
public void setSalary(int empId, double salary) {...}
}

2.6 事件的通知和檢查

EJB 3.0中, 開發人員不需要實現那些不必要的callback methods。 他可以把任意方法指定為一個事件通知方法。通過標記一個通知標注,我們把一個方法標記為一個回調方法, 例如:

@Stateful public class AccountManagementBean
implements AccountManagement {
Socket cs;
@PostConstruct
@PostActivate
public void initRemoteConnectionToAccountSystem {
...
}

@PreDestroy
@PrePassivate
public void closeRemoteConnectionToAccountSystem {
...
}
...
}

在這個EJB 3.0 的例子當中, 我們定義了一個有狀態的session Bean,把初始化的工作都交給init remote connection方法,同時標記他為一個回調方法,在construct ,和 activite之后調用
同時我們把清理的工作都交給close remote connection方法,同時標記他為一個回調方法,在destroy 和passivate之前調用

對于那些高級的用戶,需要定制自己的事件檢查和偵聽機制。檢查方法和所被檢查的對象方法可以在同一個 Bean 中,也可以在不同的JAVA Class里面。 這種檢查機制有下面的特點:
 在方法周圍進行檢查
 包裝商務方法的整個調用過程
 可以對方法調用的參數和結果進行處理
 檢查類的序列中,可以拿到上下文數據
 多個檢查類可以按照指定的順序執行
 可以用部署表述符來指定執行順序

我們用 @Interceptors 標注指定一個外部的檢查方法類, 用 @AroundInvoke制定內部的某個方法為檢查方法。在檢查方法里面,我們用proceed()來調用具體的商務方法。目前的檢查方法是檢查一個Bean里面的所有方法,專家組正在制定標準, 讓它可以具體到檢查制定的某個方法。

下面是一個EJB3.0的檢查方法的例子:

我們制定了這個無狀態session Bean檢查方法類是這三個類.
accountaudit, metrics, customsecurity。那么實際執行的時候會按照這個制定的順序來實行
檢查.

@Interceptors({
com.acme.AccountAudit.class,
com.acme.Metrics.class,
com.acme.CustomSecurity.class
})
@Stateless
public class AccountManagementBean
implements AccountManagement {
public void createAccount(int accountId, Details details) {...}
public void deleteAccount(int accountId) {...}
public void activateAccount(int accountId) {...}
public void deactivateAccount(int accountId) {...}
...
}


2.7 部署描述文件的優先級

在EJB3.0中,我們可以用標注的方法來指定對環境對象的引用,也可以用部署描述符文件(Deployment Description)的方式來制定對環境對象的應用, 也可以兩個同時使用. 如果我們在部署描述文件和代碼標注中都制定了環境對象,那么部署描述文件中的那個引用有更高的優先級, 這樣就給了應用的Deployer相對比較大的靈活性來控制.

3 持久化的魔力


3.1 最初的目標

EJB 3.0 專家組的另外一個目標是為實體Bean( Entity Bean ) 和對象/關系的映射,提供一個輕量級的模型。實際上,目前關于實體Bean的爭論很多, 很多批評人士對它的架構感到不滿,我們的目標是改善EJB 容器管理的持久化模型,從各地的一些優秀的開源軟件中吸取靈感,從一些反模式(Anti-Pattern)中吸取經驗, 從而讓新的標準稱為技術上的領跑者。 EJB3.0的持續化包括下面的一些特性:

 簡化實體bean的編程方式,減少不必要的開發接口
 改善EJB的持久化, 為O/R映射提供繼承和多態的信息
 可以在EJB Container之外使用實體Bean
 不需要Container 就可以對商務方法進行測試
 不再需要數據傳輸對象DTO (Data Transfer Objects) 之類的設計模式(Design Pattern)
 改善的EJB QL

為了解決這些意見,ejb 3.0 的專家組集中在一個經過簡化的持久化模型,目前業界已經有類似的產品和模式,比如Hibernate和Toplink, 這是一個全新的方向,代表著輕量級的對象/關系(O/R)映射模型。


在EJB3.0中,實體Bean是普通的Java 類, 這是一些真正的類, 而不是抽象類。而且更為簡化的是,開發人員不再需要實現任何接口,不論是商務借口或者是回調接口。
而且不再需要實現數據傳輸對象(DTO), 因為現在的Entity Bean本身就是一個簡單的普通JAVA 對象POJO (Plain Old Java Object), 標記為序列化之后就可以在客戶端和服務端進行傳遞,不再需要特殊的處理。

3.2 管理類的角色
在新的EJB3.0規范里面,我們看到了一個 EntityManager 類, 對于實體Bean而言,這是一個類似于調用工廠(Factory)或者統一的Home接口之類的角色。Entity manager自己的生命周期可以由Container或者應用程序都可以來管理。
Entity Manager 將負責跟蹤數據庫事務上下文中, 實體bean 對象的狀態。對于開發人員來說, javax.persistence.EntityManager 成為對實體bean的統一訪問點。 可以把它看作是對實體Bean操作的一個”home”. 我們要通過entity manager 調用實體bean的生命周期管理。 比如:Persist, Remove, Merge, Flush, Refresh, 等方法。

Entity Manager是所有Entity Bean的持久化管理接口,任何對Entity Bean的操作都必須通過它來進行。有的開發人員會對這個接口感到熟悉,因為它與Hibernate的Session接口和JDO的Persistence Manager非常相似。Entity Manager的接口主要方法如下:

package javax.ejb;

public interface EntityManager {
public void create(Object entity);
public < T > T merge(T entity);
public void remove(Object entity);
public Object find(String entityName, Object primaryKey);
public < T > T find(Class < T > entityClass, Object primaryKey);
public void flush();
public Query createQuery(String ejbqlString);
public Query createNamedQuery(String name);
public Query createNativeQuery(String sqlString);
public void refresh(Object entity);
public void evict(Object entity);
public boolean contains(Object entity);
}

EntityManager 還大大方便了查找方法的實現,記得我們在EJB2.1里面是怎么做的嗎?在EJB 3.0里面,可以直接調用EntityManager.find(String entityName, Object primaryKey),查找具有某個主鍵的實體 bean 實例。例如:

public OrderBean findByPrimaryKey(String orderId)
{ return (OrderBean)em.find("OrderBean" , orderId);
}

EntityManager作為Query對象的生產工廠, 可以用createQuery(String ejbQlString) 創建一個EJB QL 查詢,也可以用createNamedQuery(String queryName)來創建一個 NamedQuery 查詢。下面是一個例子:


public List findWithAddr(String addr) {
return em.createQuery(
"SELECT o FROM Orders o WHERE o.addr LIKE :orderAddress")
.setParameter("orderAddress", addr)
.setMaxResults(100)
.listResults();
}

3.3 O/R Mapping的標注



O/R Mappings 標注的元數據,使得用戶可以修飾他們的EJB3.0 Entity Bean. 在 EJB 3.0缺省環境下,表的名字就是類的名字, 兩者是一致的, public Java Bean getter方法假定為訪問表中同樣名字的屬性值, 開發人員可以通過@Table, @column等各種不同的標注來修改這個缺省的定義. 例子:


@Entity
@Table(name="CUSTOMER")
@SecondaryTable(name="CUST_DETAIL",
pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"))
public class Customer { ... }


@Entity 說明這是一個Entity Bean, Table標記了對應的O/R Mapping的主表, 而 SecondaryTable標記了 Entity對應的輔助表,
持續化的API, 和查詢語言,以及O/R Mapping標注, 都是EJB 3.0規范的一部分。
持久化API的設計目標是能夠獨立于Container的運行,只需要有一個Java SE環境就可以運行了。

4 小結


本文以描述了EJB 3.0規范的一些新特性。EJB 3.0將是EJB歷史上最大的一次改動,它充分吸收了一些開源項目,比如Spring、Hibernate的經驗,變得更加方便實用,體現了簡化開發的設計目標。這篇文章希望能夠給大家帶來一點關于EJB 3.0的印象,目前EJB 3.0規范已經進入了Proposed Final Draft階段,當然,將來這個規范的技術細節還可能發生變化。

(出處:http://www.49028c.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品一区二区三区| 精品国产成人av| 欧美视频国产精品| 亚洲国产成人在线播放| 国产精品一区二区久久久久| 一区二区亚洲欧洲国产日韩| 在线观看精品国产视频| 亚洲国产欧美自拍| 欧美裸体男粗大视频在线观看| 久久亚洲精品一区二区| xvideos亚洲| 日韩国产激情在线| 黄色精品在线看| 久久久999精品视频| 欧美性高潮在线| 6080yy精品一区二区三区| 欧美视频免费在线观看| 日韩中文字幕在线| 欧美限制级电影在线观看| 欧洲永久精品大片ww免费漫画| 91九色视频在线| 久久综合网hezyo| 日韩av不卡在线| 亚洲精品自拍第一页| 亚洲国产精彩中文乱码av在线播放| 欧美激情网友自拍| 亚洲国产一区二区三区四区| 一区二区欧美激情| 国产精品一区二区久久国产| 日本精品久久久久久久| 国产香蕉97碰碰久久人人| 欧美在线观看日本一区| 亚洲福利精品在线| 亚洲天堂视频在线观看| 亚洲人午夜精品免费| 成人97在线观看视频| 亚洲色图综合久久| 欧美黄色成人网| 亚洲精品乱码久久久久久金桔影视| 欧美日韩免费区域视频在线观看| 国产精品成人观看视频国产奇米| 欧美大秀在线观看| 国产91精品青草社区| 2019中文字幕全在线观看| 亚洲sss综合天堂久久| 国产女同一区二区| 亚洲人成网站777色婷婷| 久久亚洲精品成人| 欧美极品美女电影一区| 欧美性理论片在线观看片免费| xvideos亚洲人网站| 欧美日韩在线观看视频| 亚洲国产精品热久久| 亚洲精品一区久久久久久| 欧美电影免费观看网站| 日韩视频免费中文字幕| 精品二区三区线观看| 亚洲娇小xxxx欧美娇小| 国内精品久久久久久| 国产国产精品人在线视| 欧美大片在线看免费观看| 久久精彩免费视频| 久久99久国产精品黄毛片入口| 精品中文字幕在线观看| 亚洲欧美中文日韩在线| 欧美激情视频免费观看| 国产精品成人va在线观看| 午夜精品福利电影| 亚洲最大的网站| 久久久伊人日本| 中文字幕亚洲天堂| 中文字幕精品av| 久久精品91久久久久久再现| 亚洲国产精品视频在线观看| 亚洲国产日韩欧美在线图片| 亚洲激情视频网站| 黑人巨大精品欧美一区二区| 国产成人精品最新| 国产精品成人av性教育| 日韩欧美国产成人| 欧美孕妇孕交黑巨大网站| 久久人91精品久久久久久不卡| 精品国产视频在线| 国产精品视频最多的网站| 欧美激情亚洲另类| 欧美性猛交xxxx乱大交极品| 日韩日本欧美亚洲| 丝袜情趣国产精品| 久久久久久一区二区三区| 欧美性猛交xxxx久久久| 久久免费视频这里只有精品| 国产一区二区三区18| 久久精品国产久精国产一老狼| 91免费人成网站在线观看18| 国产精品羞羞答答| **欧美日韩vr在线| 国产精品人人做人人爽| 国产欧美精品一区二区三区-老狼| 久久人人爽人人爽人人片av高请| 亚洲国内高清视频| 神马久久久久久| 不卡av在线网站| 欧美日韩国产精品| 亚洲国产精品va在看黑人| 亚洲国产精品推荐| 美日韩精品免费观看视频| 亚洲欧美国产一本综合首页| 国产伊人精品在线| 国产女精品视频网站免费| 色阁综合伊人av| 国产视频丨精品|在线观看| 18久久久久久| 日韩亚洲欧美中文在线| 成人a在线观看| 欧美激情国产高清| 久久97精品久久久久久久不卡| 一区二区中文字幕| 中文字幕视频一区二区在线有码| 狠狠色狠狠色综合日日五| 久久久噜噜噜久久久| 国产精品福利小视频| 欧美日韩国产二区| 欧美日韩一二三四五区| 欧美日韩午夜剧场| 日韩精品久久久久久久玫瑰园| 欧美日韩精品在线播放| 久久久精品网站| 日本久久久久久久久久久| 亚洲色图13p| 日本精品视频在线| 久久精品成人一区二区三区| 久久久久久久久久婷婷| 亚洲女人天堂成人av在线| 中文字幕精品在线视频| 欧美在线一区二区三区四| 国产精品草莓在线免费观看| 欧美激情精品久久久| 欧美性极品xxxx做受| 亚洲男人av在线| 久久手机精品视频| 国产免费一区二区三区在线观看| 亚洲视频专区在线| 97久久超碰福利国产精品…| 亚洲午夜久久久影院| 亚洲第一男人av| 日韩有码在线电影| 日韩视频永久免费观看| 国产成人免费av| 国产精品久久久久影院日本| 国产在线久久久| 91国产高清在线| 91a在线视频| 欧美激情视频网| 国产精品99导航| 日韩一区二区精品视频| 国产精品第一第二| 欧美日韩国产123| 亚洲女同性videos| 国内精品久久久久伊人av| 国产精品成人免费电影| 欧美成人精品三级在线观看| 尤物精品国产第一福利三区| 国产一区二区成人| 38少妇精品导航|