關(guān)鍵要點
- Jakarta EE 12將重點關(guān)注集成性、現(xiàn)代化改造、配置一致性以及提升開發(fā)人員的生產(chǎn)力。
- Jakarta Query是Jakarta EE平臺中的新規(guī)范,它將作為持久化層的統(tǒng)一編程語言。該規(guī)范會將Jakarta Persistence Query Language與Jakarta Data Query Language整合為一種統(tǒng)一的規(guī)范。
- 更新后的Jakarta Data、Jakarta Persistence以及Jakarta NoSQL版本都將能夠與Jakarta Query實現(xiàn)集成。
- Jakarta NoSQL提供了一種新的查詢接口,這種接口與Jakarta Persistence中的類似接口相同,可以動態(tài)設(shè)置參數(shù),并以List、Stream或Optional的形式返回結(jié)果。
- 一個新的規(guī)范——Jakarta Agentic AI——已經(jīng)通過了制定階段的審查,最終將會提供一套與供應(yīng)商無關(guān)的API,這些API旨在簡化在Jakarta EE運行時環(huán)境下構(gòu)建、部署及運營AI代理的過程。
在2025年6月Jakarta EE 11發(fā)布之后,Jakarta EE 12的開發(fā)工作就已經(jīng)全面展開,預(yù)計這一新版本將會在集成性方面帶來改進,并與它的前身保持一致性。
Jakarta EE 12的第二個里程碑版本計劃于2026年第一季度發(fā)布。在本文中,我們將介紹那些能夠提升平臺一致性及配置靈活性、從而改善Jakarta EE開發(fā)人員使用體驗的新功能與特性。此外,我們還會重點介紹該平臺上已經(jīng)啟動的一些初期項目。
為什么這個版本對開發(fā)人員和架構(gòu)師來說如此重要
當(dāng)我們談?wù)揓ava平臺本身時,Jakarta EE 12的第二個里程碑版本實際上是對整個Java生態(tài)系統(tǒng)的重新塑造,其影響不僅僅局限于某些具體的技術(shù)規(guī)范。
Jakarta EE 12從全新的角度看待數(shù)據(jù)處理,它將查詢、數(shù)據(jù)訪問、配置以及數(shù)據(jù)一致性視為平臺的核心要素。因此,Jakarta EE 12的核心理念就是“穩(wěn)健與靈活”。
Jakarta EE是Quarkus和Spring等Java框架的基礎(chǔ)。對于開發(fā)人員來說,這一架構(gòu)意味著API更加清晰,不同層次之間的代碼重復(fù)性更低,而且無論使用哪種框架,相關(guān)概念都易于理解。
對于架構(gòu)師而言,Jakarta EE(前身為Java EE)一直以來都具備穩(wěn)定性和可移植性,而Jakarta EE 12則進一步增強了其在架構(gòu)設(shè)計方面的實用性。
該平臺現(xiàn)在明確支持多語言數(shù)據(jù)持久化技術(shù)、現(xiàn)代Java技術(shù)標(biāo)準(zhǔn),同時也關(guān)注諸如基于智能體的AI集成等新興技術(shù)領(lǐng)域,而且不會強迫開發(fā)人員使用某些不自然的抽象框架。這種設(shè)計方式使得架構(gòu)更加靈活,同時多語言數(shù)據(jù)持久化的功能也讓架構(gòu)師能夠根據(jù)具體場景選擇最適合的數(shù)據(jù)庫。
了解Jakarta EE 12的發(fā)布流程
在詳細介紹Jakarta EE 12 Milestone 2中的新功能之前,有必要先簡要說明一下開發(fā)過程中的各個階段,包括測試、社區(qū)反饋以及兩次修訂環(huán)節(jié)。與任何軟件開發(fā)過程一樣,這些規(guī)范也可能會在最終確定之前發(fā)生變化或出現(xiàn)延遲(在這個過程中,最終決定權(quán)由Jakarta EE指導(dǎo)委員會掌握)。如圖1所示,這些當(dāng)前版本的規(guī)范正是Jakarta EE 12平臺的重要組成部分:

圖1:Jakarta EE平臺中的規(guī)范內(nèi)容
需要特別注意的是,Jakarta MVC 3.1和Jakarta NoSQL 1.1的規(guī)范目前也在考慮是否被納入Jakarta EE 12平臺中。
在Jakarta EE 11版本中,Java 17被作為基準(zhǔn)技術(shù)得到應(yīng)用,同時也對Java 21提供了支持。這一設(shè)計使得開發(fā)者可以在Jakarta Persistence規(guī)范中使用Java記錄作為嵌入類或ID,在Jakarta Concurrency規(guī)范中使用虛擬線程。而對于Jakarta EE 12來說,基準(zhǔn)技術(shù)將是Java 21,并且也會支持Java 25。從平臺層面來看,這一版本標(biāo)志著人們正式告別了已經(jīng)過時的SecurityManager,對眾多老舊API進行了優(yōu)化處理,同時也改進了那些表述模糊的規(guī)范語言,為支持HTTP/3等現(xiàn)代Web協(xié)議做好了準(zhǔn)備。
由于OSSRH的終止,以及Maven Central隨后采用的新測試部署機制,某些規(guī)范無法按照原計劃發(fā)布Milestone 1版本。因此,這些規(guī)范將直接進入Milestone 2階段,具體情況請參見這個儀表盤。
我們將重點關(guān)注四個能夠發(fā)布Milestone 2版本的規(guī)范:
- Jakarta Query為持久化層提供了一種通用的面向?qū)ο缶幊陶Z言。
- Jakarta Data支持對數(shù)據(jù)倉庫進行動態(tài)查詢,并能與Jakarta Query集成使用。
- Jakarta Persistence支持Java 21中引入的SequencedCollection接口,同時也能與Jakarta Query集成。
- Jakarta NoSQL允許使用Java記錄進行數(shù)據(jù)操作,并能與Jakarta Query結(jié)合使用。
伴隨著新的“強大且靈活”的設(shè)計理念,我們可以將Jakarta EE 12稱為“數(shù)據(jù)時代”——在這個版本中,Jakarta EE生態(tài)系統(tǒng)將支持多種持久化技術(shù),從而使Jakarta EE既能使用SQL也能使用NoSQL進行數(shù)據(jù)操作;未來還可能會包含Jakarta NoSQL 1.1版本。
Jakarta Query
作為被批準(zhǔn)納入Jakarta EE 12平臺及Web Profile的新規(guī)范,Jakarta Query 1.0為持久化層提供了一種Java查詢語言。其目標(biāo)是將Jakarta Persistence中的JPQL語言與Jakarta Data中的JDQL語言整合起來,形成一種基于這兩種語言的統(tǒng)一規(guī)范:
- Jakarta Custom Query Language (JCQL)是一種基礎(chǔ)查詢語言,可用于Jakarta Data和Jakarta NoSQL規(guī)范。
- Jakarta Persistence Query Language (JPQL)則在JCQL的基礎(chǔ)上增加了關(guān)系型和實體型查詢功能,適用于Jakarta Persistence規(guī)范及其他基于SQL的技術(shù)。
由于這還是一項新規(guī)范,我們?nèi)栽趯ζ渲械囊恍﹥?nèi)容進行改進,包括規(guī)范中使用的術(shù)語及其各個組成部分。目前我們已經(jīng)有了一套定義這種由兩種語言構(gòu)成的統(tǒng)一規(guī)范的方案。
“核心語言”是Jakarta Query語言的子集,主要涵蓋了選擇、篩選、排序和簡單數(shù)據(jù)投影等基本操作功能。舉個例子,以下這個JSON格式的數(shù)據(jù)記錄就體現(xiàn)了這一特點:
{
?"id": "R-101",
?"type": "DELUXE",
?"status": "AVAILABLE",
?"number": 42
}
使用核心語言,可以通過以下查詢獲取所有可用的豪華房間,并按房間編號進行排序:
FROM Room WHERE type = 'DELUXE' AND status = 'AVAILABLE' ORDER BY number
持久化語言是一種關(guān)系型查詢語言,它引入了基于SQL的結(jié)構(gòu),如連接操作、分組處理以及批量更新或刪除功能。這些特性在關(guān)系型數(shù)據(jù)庫環(huán)境中尤為有用。例如,假設(shè)有一個包含房間信息的酒店文檔。
利用持久化語言,可以編寫如下查詢來統(tǒng)計每家酒店的入住房間數(shù)量,僅顯示入住房間數(shù)超過10間的酒店:
SELECT h.name, count(r) FROM Hotel h JOIN h_rooms r WHERE r.status = 'OCCUPIED' GROUP BY h.name HAVING count(r) > 10 ORDER BY count(r) DESC
這份規(guī)范的主要目的是作為持久化技術(shù)領(lǐng)域的參考標(biāo)準(zhǔn),因此它將被應(yīng)用于Jakarta NoSQL、Jakarta Persistence以及Jakarta Data這些項目中。
Jakarta Data
Jakarta Data 1.0是Jakarta EE 11中備受關(guān)注的新規(guī)范。該規(guī)范的最新版本Jakarta Data 1.1簡化了Java與持久化層之間的集成,使用戶能夠通過統(tǒng)一的接口同時使用NoSQL數(shù)據(jù)庫和關(guān)系型數(shù)據(jù)庫。這個新版本引入了三項新功能。
第一項功能允許在數(shù)據(jù)存儲庫中執(zhí)行動態(tài)查詢。你可以利用流暢的API來實現(xiàn)搜索操作,同時還可以在數(shù)據(jù)存儲庫中設(shè)置相應(yīng)的限制條件。
@Repository
public interface Products {
List findAll(Restriction restriction);
}
這個版本在元模型方面提供了更多功能,包括使用流暢的API進行搜索。因此,我們可以在數(shù)據(jù)存儲庫中組合多種限制條件來進行查詢:
@Inject
private Products products;
List found = products.findAll(
Restrict.all(
Product.type.equalTo(ProductType.PHYSICAL),
Product.price.greaterThan(10.00f),
Product.name.contains("Jakarta")
)
);
第二項功能是改進了搜索機制,現(xiàn)在可以使用@Is注解來進行查詢。在Jakarta Data 1.0版本中,雖然也可以使用等于條件進行查詢,但在這個新版本中,你可以選擇使用@Is注解,或者使用新的Constraint接口來構(gòu)建查詢條件:
List pricedBelow(@By(_Product.PRICE) @Is(LessThan.class) float max);
@Find
Page search(@By(_Product.NAME) @s(Like.class) String pattern,
PageRequest pagination,
Order> order);
@Find
List inSomeOtherRegionThan(@By(_Country.REGION) NotEqualTo exclude);
Jakarta Query將取代Jakarta Data中現(xiàn)已被棄用的JDQL,轉(zhuǎn)而使用核心語言來進行數(shù)據(jù)操作。這樣做的目的是為了保持兼容性,確保對使用Jakarta EE 12的用戶不會產(chǎn)生任何影響。
@Repository
public interface BookRepository extends BasicRepository
// 查找標(biāo)題符合特定模式的書籍
@Query("WHERE title LIKE :titlePattern")
List
// 按作者篩選書籍并按標(biāo)題排序
@Query("WHERE author.name = :author ORDER BY title")
List(Book> findByAuthorSortedByTitle(String author);
}
Jakarta Data最初默認使用無狀態(tài)倉庫模式。在這種模式下,每個操作都是獨立處理的,調(diào)用之間不會保留任何上下文信息或內(nèi)存數(shù)據(jù),這樣的設(shè)計使系統(tǒng)更加簡單、易于預(yù)測,并且能夠清楚地判斷每筆交易的開始和結(jié)束時間。
@Repository
public interface Products extends DataRepository {
@Persist
void add(Product product);
@Merge
Product merge(Product product);
@Remove
void remove(Product product);
@Refresh
void reload(Product product);
@Detach
void detach(Product product);
}
Jakarta NoSQL
Jakarta NoSQL 1.1是這一規(guī)范的最新版本,它使得在企業(yè)級Java應(yīng)用中集成NoSQL數(shù)據(jù)庫變得非常方便。這一版本的亮點在于支持通過Jakarta Query的核心語言功能來執(zhí)行查詢操作。由于其術(shù)語體系與Jakarta Persistence相似,因此Java開發(fā)人員可以更加輕松地在企業(yè)級應(yīng)用中使用NoSQL數(shù)據(jù)庫。
Jakarta NoSQL提供了兩項重要功能。首先是新的Query接口,該接口的結(jié)構(gòu)與Jakarta Persistence中已有的對應(yīng)接口類似。這個接口充當(dāng)了核心語言與Jakarta NoSQL規(guī)范之間的橋梁,允許你動態(tài)設(shè)置查詢參數(shù),并將查詢結(jié)果以List、Stream或Optional的形式返回。
List
.bind("type", CarType.SPORT)
.result();
新的TypedQuery接口允許你在查詢中定義相應(yīng)的實體,并將其直接作為該實體本身返回;或者通過由記錄類定義的投影結(jié)構(gòu)來返回它。
@Projection(from = Car.class)
public record BudgetCar(String name, double price) {}
List cheapCars = template
.typedQuery("WHERE price < 100", BudgetCar.class)
.result();
Jakarta Persistence
Jakarta Persistence 4.0這一最新版本引入的一項新功能是將JPQL語言轉(zhuǎn)換為Jakarta Query語言。Jakarta Persistence仍然會使用JPQL,這與它在使用Jakarta Data時的做法一致;這種語言設(shè)計保證了向后兼容性,因此不會影響那些仍在使用舊版JPQL的Java開發(fā)者。
Jakarta Persistence還支持Java 21規(guī)范,從而能夠支持新的數(shù)據(jù)結(jié)構(gòu):
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationTypeUUID)
private UUID id;
@Column(nullable = false)
private String customer;
@Columnnullable = false)
private Instant createdAt = Instant.now();
@ElementCollection
@CollectionTable(name = "order_lines",
joinColumns = @JoinColumn(name = "order_id"))
@Column(name = "item")
private SequencedCollection items = new LinkedHashSet<>();
}
目前有人正在討論是否應(yīng)該在Jakarta Data中添加用于靜態(tài)查詢的注解,這樣就可以為結(jié)合使用Jakarta Data和Jakarta Persistence來執(zhí)行查詢提供更多功能與選項。
@Repository
interface Library {
@StaticQuery("where title like :pattern")
@ReadQueryOptions(cacheStoreMode=BYPASS)
List books(String pattern);
}
你可以通過Gavin King這篇博文,了解更多關(guān)于Jakarta Persistence 4.0的信息。Gavin是IBM的紅帽高級杰出工程師。
Jakarta Agentic Artificial Intelligence
2025年11月初,一項專注于人工智能應(yīng)用的新規(guī)范通過了審批。Jakarta Agentic AI規(guī)范提供了一套與供應(yīng)商無關(guān)的API,這些API旨在簡化、標(biāo)準(zhǔn)化以及優(yōu)化在Jakarta EE運行時環(huán)境中構(gòu)建、部署及運營人工智能代理的過程。
通過這種統(tǒng)一的開發(fā)方式,開發(fā)者能夠在不同的環(huán)境中更高效、更一致地創(chuàng)建智能解決方案。
這些API的設(shè)計旨在促進互操作性和可靠性,使各組織能夠在保持靈活性并遵循行業(yè)最佳實踐的前提下加速創(chuàng)新進程。
這一新規(guī)范的范圍包括以下內(nèi)容:
- 為在Jakarta EE運行時環(huán)境中運行的AI代理建立標(biāo)準(zhǔn)化的使用模式和生命周期,從而提升各類實現(xiàn)的互操作性及一致性。
- 提供簡潔的接口來訪問基礎(chǔ)的人工智能功能,例如大型語言模型,但并不要求對這些模型本身進行標(biāo)準(zhǔn)化處理。該API能夠以直觀、可插拔且可配置的方式與現(xiàn)有的LLM API(如LangChain4j和Spring AI)進行集成,其工作原理類似于Jakarta Persistence對非標(biāo)準(zhǔn)底層API的封裝方式。
- 預(yù)計該API會采用Java語言來定義代理的工作流程,而非XML格式。這些工作流程在運行時是動態(tài)變化的,能夠靈活適應(yīng)各種需求,而無需在部署時依賴靜態(tài)定義。此外,也可能支持通過YAML或XML等格式實現(xiàn)可插拔性。
- 實現(xiàn)與Jakarta EE核心規(guī)范之間的集成,這些規(guī)范包括Jakarta Validation、Jakarta RESTful Web Services、Jakarta JSON Binding、Jakarta Persistence、Jakarta Data、Jakarta Transactions、Jakarta NoSQL、Jakarta Concurrency、Jakarta Security以及Jakarta Messaging等。
- 實施方案還可以選擇與OpenTelemetry進行集成,從而提升系統(tǒng)的可觀測性。
在可行的情況下,該項目會利用Jakarta Config進行配置管理;同時也允許實現(xiàn)方案使用MicroProfile Config。
Jakarta Agentic AI 1.0作為初始版本,其設(shè)計初衷就是保持簡潔性,以此促進早期應(yīng)用、激發(fā)社區(qū)參與熱情,并提升人們對這一項目的認知度。后續(xù)的升級版本將結(jié)合行業(yè)發(fā)展趨勢以及用戶和貢獻者的反饋來進行優(yōu)化,以確保該規(guī)范始終具有實用性和前瞻性。
這個版本主要聚焦于基礎(chǔ)編程模型和最佳實踐,并提供了用于集成LLM的輕量級接口。未來的版本預(yù)計會進一步擴展對程序化生命周期的管理功能,并提供更完善的工作流程API,以支持更高級別的代理協(xié)調(diào)工作。
該規(guī)范目前仍處于開發(fā)階段,因此你可以通過參與規(guī)范制定過程、提供反饋或通過郵件列表或直接在各規(guī)范對應(yīng)的GitHub倉庫中報告錯誤來為最終版本的完善做出貢獻。如果你想直接參與代碼開發(fā)但不知道從何入手,還可以參加Jakarta EE社區(qū)導(dǎo)師計劃,在那里你將學(xué)習(xí)如何在Java企業(yè)平臺上進行代碼開發(fā)工作。
Jakarta EE 12的采用時間表
與任何軟件開發(fā)過程一樣,里程碑版本的發(fā)布并不是為了在生產(chǎn)環(huán)境中直接使用;它的目的是讓開發(fā)人員能夠進行實驗、測試并提供反饋。里程碑版本發(fā)布的意義,與OpenJDK中提供的試驗性功能或預(yù)覽版類似。
Jakarta EE 12通過保持向后兼容性,兌現(xiàn)了其核心承諾,從而為那些已經(jīng)在使用Jakarta Persistence和Jakarta Data的工具和組織帶來了好處。最近所做的改進,包括統(tǒng)一查詢語言以及明確區(qū)分有狀態(tài)與無狀態(tài)的數(shù)據(jù)庫模型,這些措施都有效消除了各種不確定性。這些變更的重點在于提高代碼的透明度,讓人們能夠更容易地發(fā)現(xiàn)舊代碼中存在的異常行為。在當(dāng)前這個階段,架構(gòu)師和開發(fā)人員需要暫時停止解決那些緊急問題,以便了解新的技術(shù)規(guī)范將如何改變他們現(xiàn)有的工作方式。
要想讓Jakarta EE 12得到廣泛采用,工具的支持將是決定性因素,尤其是在處理查詢操作和基于數(shù)據(jù)庫的數(shù)據(jù)訪問功能時。目前,這一開發(fā)階段仍需進一步努力,才能完善IDE集成、查詢驗證、代碼重構(gòu)以及運行時診斷等功能。只有當(dāng)這些工具真正成熟之后,整個工具生態(tài)系統(tǒng)才能發(fā)揮出其全部潛力。
結(jié)論
Jakarta EE 12的第二個里程碑標(biāo)志著邁向這一企業(yè)級Java平臺新版本的第一個步驟。通過開放和透明的貢獻機制,整個社區(qū)都能夠?qū)ο嚓P(guān)技術(shù)規(guī)范提出反饋意見。Jakarta Query的引入,將多年來從JPQL到JDQL的發(fā)展歷程整合成了一種統(tǒng)一且可擴展的查詢語言,這種語言能夠同時支持關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫。現(xiàn)在,Jakarta Data、Jakarta Persistence以及Jakarta NoSQL都共享著統(tǒng)一的查詢基礎(chǔ),這一設(shè)計有助于減少技術(shù)碎片化現(xiàn)象,進而提升整個開發(fā)生態(tài)系統(tǒng)的效率。
以Java 21作為新的基準(zhǔn),Jakarta EE繼續(xù)秉承著擁抱現(xiàn)代Java語言特性的傳統(tǒng),從而提供了更優(yōu)異的性能、更簡潔的語法以及更高的長期可維護性。雖然這個里程碑標(biāo)志著Jakarta EE 12發(fā)展的起點,但它已經(jīng)指明了明確的發(fā)展方向:各技術(shù)規(guī)范之間將實現(xiàn)更加緊密的整合,開發(fā)人員的效率也會得到進一步提升,同時,Jakarta EE與核心Java平臺的融合程度也會進一步加強。
接下來的第三和第四個里程碑將進一步完善各項功能,穩(wěn)定API接口,并提升兼容性。