Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使拥有的一对多rs持久化。在JDO中无法可靠工作_Java_Google App Engine_Persistence_Jdo_Datanucleus - Fatal编程技术网

Java 使拥有的一对多rs持久化。在JDO中无法可靠工作

Java 使拥有的一对多rs持久化。在JDO中无法可靠工作,java,google-app-engine,persistence,jdo,datanucleus,Java,Google App Engine,Persistence,Jdo,Datanucleus,PersistenceManager的makePersistent方法工作不可靠。同一个junit测试正在运行,过了一会儿又失败了?! 我有一个包含其他对象集合的对象。这意味着1-n关系。 我的问题是,我的类的junit测试有时会失败,因为集合中的对象没有正确持久化。 我通常使用事务,但persistanceManager是事务可选的 我尝试在每次createObject和commit之后检查objectState。。。 我发现,成功提交后集合中的对象没有systemId(应该自动生成),但处于

PersistenceManager的makePersistent方法工作不可靠。同一个junit测试正在运行,过了一会儿又失败了?! 我有一个包含其他对象集合的对象。这意味着1-n关系。 我的问题是,我的类的junit测试有时会失败,因为集合中的对象没有正确持久化。 我通常使用事务,但persistanceManager是事务可选的

我尝试在每次createObject和commit之后检查objectState。。。 我发现,成功提交后集合中的对象没有systemId(应该自动生成),但处于中空/持久非事务状态

这意味着有时它们是(如果它们是持久的):

注释[systemId=Project(1)/Comment(6),JDO ObjectState=hollow/persistent nontransactional]

有时它们是(如果它们没有被持久化,并且父对象的重构包含一个空集合) 注释[systemId=null,JDO ObjectState=hollow/persistent非事务性]

当然,我可以手动检查所有存储的对象是否都有systemId,但这种方法一点也不好。提交应该失败

我不明白它有时有效,有时无效!这意味着我的代码不应该是错误的,这是一个错误。。。 请帮帮我

附言:如果需要,我可以发布一些代码

@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
}
@PersistenceCapable
公共类Ble实现可序列化的JDOOObject{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
//NotNull
@主键
@持久性(valueStrategy=IdGeneratorStrategy.IDENTITY)
私钥系统ID;
//NotNull
@持久的
私钥父ID;
//NotNull
@持久的
@扩展名(vendorName=“datanucleus”,key=“gae.parent pk”,value=“true”)
私钥投影;
//NotNull
@持久的
私有字符串标题;
@持久的
私人职位;
@持久的
私生子;
@持久的
私人数据要求数据;
@持久的
私人名单评论;
//吸气剂/塞特
}
子对象

    @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    
}
@PersistenceCapable
公共类注释实现可序列化的JDOObject{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
@主键
@持久性(valueStrategy=IdGeneratorStrategy.IDENTITY)
私钥系统ID;
@持久的
私有字符串文本;
@持久的
私有长创建时间戳;
//getter//Setter
}

如果我尝试添加注释但它不起作用,则会删除日志

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;
}

解决方案总是为每个事务使用新的persistanceManager。永远不要重复使用pm

查看日志会告诉你很多。好的,我在哪里可以找到“日志”?你在哪里定义了它?“log4j.properties”会定义它。你发布的日志是信息级别的(因此省略了调试级别的所有有用内容)。使用GAE JDO pluginv2的v2.x。x是谷歌的默认安装(使用SDK 1.7.1)