Q: EJB 3 如何擺脫事務描述符?
A: 會話 Bean/消息驅動 Bean 通過註解或描述符控制事務屬性;默認事務屬性改為 REQUIRED(EJB 2.x 為 SUPPORTS),大多數業務方法無需額外配置。JPA 實體僅本地使用,不配置事務/安全/遠程,由會話 Bean Facade 統一管控企業級關注點。
Q: 主鍵用 long 還是 Long?
A: 視數據模型:允許 NULL 用 Long,非空用 long。傾向 long 避免 NULL 語義混淆。
Q: EJB 2.x 不支持繼承?
A: EJB 2.1 規範附錄 D3 明確:「未指定組件繼承概念」。JPA 完整支持實體繼承、多態查詢與關聯。
Q: JPA 支持組合主鍵嗎?
A: 支持自然鍵、組合鍵、數據庫生成/應用分配數值鍵。
Q: 有像 JdbcTemplate 的 JPA 模板嗎?
A: Spring 2 提供 JpaTemplate,但推薦直接用 @Repository + EntityManager,利用 Spring 異常轉譯,避免模板層開銷。持久化單元可部署到 Spring 容器,遵循規範注入規則。
Q: JPA 支持 JDK 1.4 嗎?
A: 需要 Java 5+(註解、泛型、枚舉等語言特性)。
Q: 範圍查詢能否同時返回總數?
A: 不能。需額外執行 SELECT COUNT(...),首次查詢時獲取總數存入會話/Cookie,後續分頁只查數據。
Q: 帶 JPA 包裝器的 Hibernate 是 EJB3 實現嗎?
A: JPA 是 EJB3 子集;Hibernate 是 JPA 實現,非完整 EJB3 容器。
Q: JPA 比 Hibernate 好嗎?
A: 規格 vs 實現,不可直接比較。標準 API 可移植,廠商特有功能(如 OpenJPA 保存點)按需調用。
Q: 還需學 Hibernate 嗎?
A: 核心開發用 JPA API;僅在需要廠商特有功能時調用具體實現(如 OpenJPAEntityManager)。
Q: 規范解決二級緩存嗎?
A: 未解決。僅規定一致性約束。未來版本可能增加基本控制 API(驅逐、釘住)。各廠商自行實現(OpenJPA DataCache/QueryCache)。
Q: EntityManager 承擔重活,會話 Bean 還有價值嗎?
A: 會話 Bean 提供:安全性、事務邊界、遠程訪問、有狀態會話數據、部署單元、公共服務邊界。Servlet/JSP 直用 JPA 需自管事務、集群、故障轉移。
Q: EJB3 vs EJB2 併發事務數?
A: 會話 Bean 層無差異。實體層:JPA 非主鍵查詢擴展性更好;深度使用鎖定組等進階功能可進一步提升。
Q: 不加載內存能批量更新嗎?
A: JPQL 支持:UPDATE Employee e SET e.salary = e.salary * 1.1 WHERE e.salary < 100000。
Q: 替代 ejbLoad/ejbStore?
A: JPA 提供 @PrePersist、@PostLoad、@PreUpdate、@PostRemove 等生命周期回調註解。
Q: 如何替換 EJB2 CMP/BMP?
A: JPA 完整替代 CMP;BMP 建議改用會話 Bean Facade + 自定義持久化。
Q: 命名查詢能否放實體外部?
A: 規范僅掃描實體類。可在 orm.xml 定義,持久化單元合併多個 orm.xml。
Q: 跨所有實體表配置前綴?
A: 規范無此功能。OpenJPA 可擴展 DBDictionary 重寫 getValidTableName() 實現。
大規模遷移(350+ 實體)遇性能問題,優先檢查 @OneToOne/@ManyToOne 默認急加載,改為 LAZY;善用 FetchGroup、JOIN FETCH 控制加載圖譜。