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
}