一对多关系孩子抛出“无法使一个或多个实例持久化”

问题描述 投票:1回答:2

我有两个类,每个类都是PersistentCapable-一个Event和一个Score类。Event类包含一个ArrayList of Scores。

我有一个建立事件列表的方法,然后尝试使用以下方法将事件及其对应的分数保存到数据存储中:

PersistenceManager pm = PMF.get().getPersistenceManager();
        try {
            pm.makePersistentAll(Event.getEvents());
        } finally {
            pm.close();
        }

所有事件均保存到数据存储区中(我可以在/ _ah / admin中看到它们)。但是,分数不会保存(至少大多数分数不会保存)。

第一个事件保存的所有得分,但其他事件的得分都不是。所有事件都有分数,并且在尝试保存到数据存储之前填充列表。

我对makePersistentAll()的呼叫也引发了javax.jdo.JDOUserException: One or more instances could not be made persistent

最后,我可以在数据存储区管理员中看到,尽管事件均已保存,但它们的得分值是一堆(约15个)空值的列表。所有其他值均正确。密钥也都是唯一的(尽管我是手动生成的)。

关于出什么问题的任何想法?

事件:

@PersistenceCapable(detachable="true")
public class Event {
    @NotPersistent
    protected static ArrayList<Event> events = new ArrayList<Event>();

    @PrimaryKey
    @Persistent
    private Key key;

    @Persistent
    private String name;
    @Persistent
    private String date;
    @Persistent
    private String year;
    @Persistent
    private String scoresUrl;
    @Persistent
    private ArrayList<Score> scores;

分数:

@PersistenceCapable(detachable="true")
public class Score {
    @PrimaryKey
    @Persistent
    private Key key;
    @Persistent
    private Key eventKey;
    @Persistent
    private String unitName;
    @Persistent
    private int place;
    @Persistent
    private float score;

在logging.properties中设置.level = FINEST之后,我看到三个条目,在保存所有事件之后,我认为可能会导致问题。在makePersistentAll()可以进入得分对象之前,好像连接已关闭。

Aug 17, 2012 2:15:42 PM org.datanucleus.store.connection.ConnectionManagerImpl closeAllConnections
FINE: Connection found in the pool : com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl$DatastoreManagedConnection@77a477b7 for key=org.datanucleus.ObjectManagerImpl@45e4d960 in factory=ConnectionFactory:nontx[com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl@4eafccbe] but owner object closing so closing connection
Aug 17, 2012 2:15:42 PM org.datanucleus.store.connection.ConnectionManagerImpl$1 managedConnectionPostClose
FINE: Connection removed from the pool : com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl$DatastoreManagedConnection@77a477b7 for key=org.datanucleus.ObjectManagerImpl@45e4d960 in factory=ConnectionFactory:nontx[com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl@4eafccbe]
Aug 17, 2012 2:15:42 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: /scores
javax.jdo.JDOUserException: One or more instances could not be made persistent
java google-app-engine persistence jdo
2个回答
1
投票

根据Shivan Dragon的建议,我从使用PersistenceManager转到在事务中进行所有操作。

它看起来不那么整洁(因为我需要显式设置每个属性),但是它现在可以按预期工作,并且不再引发异常。

我完全可以接受额外的混乱,因为这种方法还使我可以更好地控制何时以及何时不将个人实体的数据保存到数据存储中。


0
投票

因为我遇到了同样的问题,所以我找到了解决问题的方法。

我曾使用PersistenceManager查找我要删除的所有持久对象。之后,我尝试仅删除第一个。例如:

PersistenceManager pm = ...
List<MyEntity> myEntityList = pm.newQuery(MyEntity.class).executeList();
pm.deletePersistent(myEntityList.get(0));// Pretend that myEntityList has at least one object.

这样,您将收到另一个错误,它将告诉您问题所在。从第二个错误中,我已经了解到我需要删除外键上的非null约束。或者从这一点开始,您应该看到MySql错误,而不是更多的JDO错误。

© www.soinside.com 2019 - 2024. All rights reserved.