2012-09-04 43 views
0

PersistenceManager的makePersistent方法工作不穩定。同一個junit-test正在工作,過了一段時間它又失敗了! 我有一個包含其他對象集合的對象。這意味着1-n關係。 我的問題是,我的類的junit測試有時會失敗,因爲集合中的對象沒有正確保存。 我使用通常的交易,但persistanceManager是交易可選makePersistent擁有一對多rs。在JDO中不能可靠地工作

我嘗試檢查每個創建對象後objectState並承諾... 我想通了,該集合中的對象後成功提交沒有的systenId(應該是自動生成),但處於空心/持久非事務狀態。

有時它們(如果它們持續)這意味着:

註釋[的systenId =項目(1)/評論(6),JDO-ObjectState =空心/持久非]

有時它們(如果它們不持久和父對象的refach包含一個空的集合) 註釋[的systenId = NULL,JDO-ObjectState =空心/持久非]

關閉當然,我可以查手動如果所有存儲的對象都有systemId,但這種方法根本不好。提交應該只是失敗!

我不明白,它有時工作,有時不是!這意味着我的代碼不應該是錯的,這是一個錯誤... 請幫我一下

PS:我可以發佈一些代碼,如果有必要!

@PersistenceCapable 
public class Ble implements Serializable, JDOObject<Ble> { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

// NotNull 
@PrimaryKey 
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
private Key systemId; 

// NotNull 
@Persistent 
private Key parentId; 

// NotNull 
@Persistent 
@Extension(vendorName = "datanucleus", key = "gae.parent-pk", value = "true") 
private Key projectId; 

// NotNull 
@Persistent 
private String title; 

@Persistent 
private int position; 

@Persistent 
private boolean hasChildren; 

@Persistent 
private BleData requirementData; 

@Persistent 
private List<Comment> comments; 


//getter/setter 
} 

childObject

@PersistenceCapable 
public class Comment implements Serializable, JDOObject<Comment> { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

@PrimaryKey 
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
private Key systemId; 

@Persistent 
private String text; 

@Persistent 
private long createdTimestamp; 

//getter//Setter  
} 
+1

看着日誌會告訴你很多。 – DataNucleus

+0

好的,我可以在哪裏找到「日誌」? – headgrowe

+1

*您*定義了哪裏? 「log4j.properties」會定義它。 – DataNucleus

回答

1

該解決方案始終爲每個事務使用一個新的persistanceManager。永遠不要重用下午!

0

日誌,如果我嘗試添加評論,它不工作

05.09.2012 15:02:06 org.datanucleus.jdo.metadata.JDOMetaDataManager$MetaDataRegisterClassListener registerClass 
INFO: Listener found initialisation for persistable class com.Comment 
05.09.2012 15:02:06 org.datanucleus.store.appengine.MetaDataValidator validate 
INFO: Performing appengine-specific metadata validation for com.Comment 
05.09.2012 15:02:06 org.datanucleus.store.appengine.MetaDataValidator validate 
INFO: Finished performing appengine-specific metadata validation for com.Comment 
Comment [systemId=null, text=testAddCommentToBle - comment , createdTimestamp=1346850126819, JDO-Status=hollow/persistent-nontransactional] 

日誌,如果我嘗試添加評論,這是工作

05.09.2012 15:00:25 org.datanucleus.jdo.metadata.JDOMetaDataManager$MetaDataRegisterClassListener registerClass 
INFO: Listener found initialisation for persistable class com.Comment 
05.09.2012 15:00:26 org.datanucleus.store.appengine.MetaDataValidator validate 
INFO: Performing appengine-specific metadata validation for com.Comment 
05.09.2012 15:00:26 org.datanucleus.store.appengine.MetaDataValidator validate 
INFO: Finished performing appengine-specific metadata validation for com.Comment 
Comment [systemId=Project(1)/Comment(6), text=testAddCommentToBle - comment , createdTimestamp=1346850025996, JDO-Status=hollow/persistent-nontransactional] 

添加方法廁所ks是這樣的。

public Boolean addCommentToBle(Key systemKey, Comment comment) 
     throws Exception { 
    PersistenceManagerFactory PMF = PersistenceUtil.getPersistenceManagerFactory(); 
    PersistenceManager pm = PMF.getPersistenceManager(); 
    pm.currentTransaction().begin(); 
    Ble ble= pm.getObjectById(Ble.class, systemKey); 
    System.out.println(ble); 
    ble.getComments().add(comment); 
    pm.makePersistent(ble); 
    pm.currentTransaction().commit(); 
    return true; 
}