J2EE Server:Weblogic
Persistent framework: Kodo
mapping設定產生方式: MyEclipse Enterprise WorkbenchVersion: 5.5.1 GA
EJB3 Reverse Engineering annotation


=====================================================
問題一:新增一對多關聯的子項資料時,ManyToOne的物件必須要是persistent object,不能new 一個父object 然後set PK,否則會出現錯誤




錯誤如下


ansaction Name=[EJB com.pchome.nas.app.biz.ejb.imp.APformSB.mergeAPform(com.pchome.nas.persistence.v
o.RequestVO)],Xid=BEA1-003C3CA98F91CD1DF7F1(32086044),Status=Rolled back. [Reason=<4|false|0.9.7> or
g.apache.openjpa.util.InvalidStateException: Encountered unmanaged object "com.pchome.nas.persistenc
e.entity.NasOrder@156f423" in persistent field "com.pchome.nas.persistence.entity.NasApplydataVerfie
d.nasOrder" of managed object "com.pchome.nas.persistence.entity.NasApplydataVerfied@10abcb4" during
flush. However, this field does not allow cascade persist. You cannot flush unmanaged objects.

FailedObject: com.pchome.nas.persistence.entity.NasOrder@156f423]
...


備註: 父NasOrder 子 NasApplydataVerfied


NasApplydataVerfied 裡的annotation


@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
@JoinColumn(name = "APDATA_ORDER_ID", unique = false, nullable = true, insertable = true, updatable = true)
public NasOrder getNasOrder() {
return this.nasOrder;
}


因此在新增NasApplydataVerfied時,必須先去DB找出NasOrder 再set進 NasApplydataVerfied FK欄位


Info: NAS APformSB mergeAPform


=====================================================
問題二:兩層物件查詢


SELECT n FROM NasOrder n WHERE n.orderPartnerUuid= :partnerId AND n.nasOrderStatuses.ostatusCExpireDate BETWEEN :d1 AND :d2
...
return this.query(jql.toString(), map);


this.query中使用em.createQuery(hsql).getResultList()查詢


會產生下面錯誤
<2|false|0.9.7> org.apache.openjpa.persistence.EntityExistsException: An object of type "com.pchome.
nas.persistence.entity.NasApplydata" with oid "2007120407010051000" already exists in this context;
another cannot be persisted.


改用以下寫法即可
StringBuffer sql = new StringBuffer("SELECT o.* FROM NAS_ORDER o ");
sql.append("LEFT JOIN NAS_ORDER_STATUS os ON o.ORDER_ID = os.OSTATUS_ORDER_ID ");
sql.append("AND OSTATUS_C_EXPIRE_DATE BETWEEN ");
sql.append(" TO_DATE('");
sql.append(SystemUtil.ymd.format(start));
sql.append("','yyyy/MM/dd') AND TO_DATE('");
sql.append(SystemUtil.ymd.format(end));
sql.append("','yyyy/MM/dd')");


return this.queryNative(sql.toString(), new NasOrder());


this.query中使用query = em.createNativeQuery(sql, ((E)hobj).getClass());查詢


Info: NAS QuerySB getWillExpireOrders


=====================================================
問題三:離線object無法直接update


Client傳來NasApplydataVO
Server將NasApplydataVO copy 成 NasApplydata (Entity)


NasApplydata必須為persistent object
NasApplydata ap = apDAO.findById(apFromClient.getApdataId());
NasApplydata apd = this.transformToNasApplydata(apFromClient, ap, o);


如果new NasApplydata,會產生錯誤
NasApplydata apd = this.transformToNasApplydata(apFromClient, new NasApplydata(), o);


錯誤如下

<2|false|0.9.7> org.apache.openjpa.persistence.EntityExistsException: An object of type "com.pchome.
nas.persistence.entity.NasApplydata" with oid "2007120407010051000" already exists in this context;
another cannot be persisted.


Info: NAS APformSB mergeAPform


=====================================================
問題四:有些情況無法取得OneToMany object


NasSkypeOrder so = (NasSkypeOrder)no.getNasSkypeOrders().iterator().next();
在Jeff 的環境 so 會為null


Info: NAS QuerySB getAccountInfo transformToOrderStatusVO

arrow
arrow
    全站熱搜

    babyincar 發表在 痞客邦 留言(0) 人氣()