0

PersistenceManager の makePersistent メソッドが確実に機能していません。同じjunit-testが機能していて、しばらくすると再び失敗しますか?! 他のオブジェクトのコレクションを含むオブジェクトがあります。つまり、1対nの関係です。私の問題は、コレクション内のオブジェクトが適切に永続化されていないために、クラスの junit-test が時々失敗することです。私は通常トランザクションを使用していますが、persistanceManager はトランザクション オプションです

createObject と commit のたびに objectState を確認してみました... コミットが成功した後のコレクション内のオブジェクトには systemId がなく (自動生成されるはずです)、中空/永続的非トランザクション状態であることがわかりました。

つまり、(永続化されている場合) 次のような場合があります。

コメント [systemId=Project(1)/Comment(6), JDO-ObjectState=hollow/persistent-nontransactional]

場合によっては (永続化されず、親オブジェクトの再処理に空のコレクションが含まれる場合) コメント [systemId=null, JDO-ObjectState=hollow/persistent-nontransactional]

もちろん、格納されているすべてのオブジェクトに 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    
}
4

2 に答える 2

1

解決策は、常にトランザクションごとに新しい persistanceManager を使用することです。pmを再利用しないでください!!

于 2012-12-18T14:59:50.757 に答える
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]

add メソッドは次のようになります。

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;
}
于 2012-09-05T12:51:17.787 に答える