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
Persistent framework: Kodo
mapping設定產生方式: MyEclipse Enterprise WorkbenchVersion: 5.5.1 GA
EJB3 Reverse Engineering annotation
=====================================================
問題一:新增一對多關聯的子項資料時,ManyToOne的物件必須要是persistent object,不能new 一個父object 然後set PK,否則會出現錯誤
錯誤如下
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
全站熱搜
留言列表