WebLogic 作為重量級 Java EE 容器,EJB 3 開發中有別於 JBoss/GlassFish 的特有坑點。本文彙總實戰踩過的 9 大核心問題與解決方案。
EjbTestBean/remoteEjbTestBean#com.full.Interface (介面全限定名)Console → Services → Data Sources → New,設定 JNDI 名稱 (如 jdbc/myDS),persistence.xml 引用 <jta-data-source>jdbc/myDS</jta-data-source>。
@Stateless(mappedName = "EjbTest") // 否則遠端查找失敗
public class EjbTestBean implements IEjbTest { ... }
Type genType = clazz.getGenericSuperclass(); // WebLogic 下回傳 null 或 Object
// 解法:避免依賴此反射手法,改用顯式傳遞 Class 參數
select / update / delete 開頭。COUNT(entity) 而非 COUNT(*)。FETCH JOIN 子查詢不可直接用於 COUNT (會立即載入關聯導致外鍵缺失)。自訂 class MyList extends ArrayList 實作 List 介面繞過序列化/代理問題。
// 多方 (商品)
@ManyToOne(cascade = CascadeType.REFRESH)
@JoinColumn(name = "lb_id", insertable = false, updatable = false)
public LbBean getLbBean() { return lbBean; }
// 一方 (類別)
@OneToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY, mappedBy = "lbBean")
@OrderBy("spId desc")
public List getSpSet() { return spSet; }
注意:JPA 不支援級聯刪除一方時自動刪多方,需手寫刪除 SQL (先刪多方再刪一方)。
List、單 Bean 可直接回傳。Map 需封裝:XmlAdapter> + @XmlJavaTypeAdapter。cd $WL_HOME/server/lib
java -jar ../../../modules/com.bea.core.jarbuilder_1.0.0.0.jar
# 產生 wlfullclient.jar,放入客戶端 classpath (如 JBoss server/default/lib)