Google app engine 未为无主多对多关系保存对象

Google app engine 未为无主多对多关系保存对象,google-app-engine,many-to-many,entity-relationship,jdo,Google App Engine,Many To Many,Entity Relationship,Jdo,通过在两个支持持久性的对象中添加列表,我在JDO中设置了一个无主的多对多关系。 为了解释我的问题,让我们调用这两个实体 实体A和实体B 现在,当我有一个新的EntityB对象要附加到EntityA对象时,我将该键附加到EntityA对象,并在其上调用makePersistent,从而保存该对象。 我通过在控制台上打印来验证 因为这是一个多对多的关系,我也必须在关系的另一端做同样的事情。 因此,我使用 从+clazz.getName+where:keys.containskey中选择,并将Enti

通过在两个支持持久性的对象中添加列表,我在JDO中设置了一个无主的多对多关系。 为了解释我的问题,让我们调用这两个实体

实体A和实体B

现在,当我有一个新的EntityB对象要附加到EntityA对象时,我将该键附加到EntityA对象,并在其上调用makePersistent,从而保存该对象。 我通过在控制台上打印来验证

因为这是一个多对多的关系,我也必须在关系的另一端做同样的事情。 因此,我使用 从+clazz.getName+where:keys.containskey中选择,并将EntityA对象中存在的键列表传递给它

我遇到的问题是,返回的对象是空的,因此即使我将EntityA键附加到获取的对象,它们也不会保存到数据存储中

我是JDO和GAE的新手,从昨天起就一直面临这个问题。 有人能解释一下吗?如果需要,我也可以提供示例代码

这是代码

@PersistenceCapable
public class Objective {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private boolean active;
@Persistent
private int corporate;
@Persistent
private String nameOfObjective;
@Persistent
private String shortDescription;
@Persistent
private int status;

@Persistent
private List<Key> scoreCardKeys; //List of Keys of Scorecards.


@PersistenceCapable
public class Scorecard {

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

@Persistent
private boolean active;
@Persistent
private int corporate; // synonymous to being public 
@Persistent
private Date creationDate;
@Persistent
private String nameOfScorecard;
@Persistent
private String shortDescription;

@Persistent
private Key createdUserKey;

@Persistent
private List<Key> objectiveKeys; // List of Keys of Objectives
目标实体和记分卡实体处于无主多对多关系中

下面是将更新记分卡的processor方法

public ScoreCardRepresentation updateScoreCard(ScoreCardRepresentation scoreCardRepresentation) {
    Scorecard scoreCard = scoreCardTransformer
            .transformRtoEForSave(scoreCardRepresentation);

    scoreCard.setCreationDate(new Date());

    Scorecard updatedScoreCard = scoreCardDAO.saveScoreCard(scoreCard); /*     Update the scorecard, this already has the list of Key of Objectives in it, Hence blindly save it. */

/* Update the Key of the scorecard in the Objectives too */       
updateRelatedObjectivesToScoreCard(scoreCardRepresentation,updatedScoreCard);




private void updateRelatedObjectivesToScoreCard(
        ScoreCardRepresentation scoreCardRepresentation,
        Scorecard updatedScoreCard) {
List<String> addedObjectivesIds =  scoreCardRepresentation.getAddedObjectiveKeys();
List<String> deletedObjectivesIds =  scoreCardRepresentation.getRemovedObjectiveKeys();

    // Add ScoreCard to the newly added Objectives
    if(addedObjectivesIds != null && addedObjectivesIds.size()>0){

Scorecard sc = scoreCardDAO.findScoreCardById(Scorecard.class, updatedScoreCard.getKey());
        List<Key> objKeys = sc.getObjectiveKeys();

        List<Objective> objectives = objectiveDAO.findObjectivesByKeys(Objective.class,objKeys);
//这使用查询select from+clazz.getName+where:keys.containskey

        for(Objective obj : objectives){
            List<Key> scoreCardKeys = obj.getScoreCardKeys();
            if(scoreCardKeys != null){
                scoreCardKeys.add(sc.getKey());
            } else { 
                scoreCardKeys = new ArrayList<Key>();
                scoreCardKeys.add(sc.getKey());
            }
            obj.setScoreCardKeys(scoreCardKeys);
            Objective updatedObjective = objectiveDAO.saveObjective(obj);
            System.out.println(new ObjectiveProcessor().viewObjective(KeyFactory.keyToString(obj.getKey())));
        }
    }

    //Remove Scorecard entries from Objective. 
    if(deletedObjectivesIds != null && deletedObjectivesIds.size()>0){
        List<Objective> objectives = objectiveDAO.findObjectivesByIds(Objective.class,deletedObjectivesIds);
        for(Objective obj : objectives){
            List<Key> scoreCardKeys = obj.getScoreCardKeys();
            if(scoreCardKeys != null){
                scoreCardKeys.remove(updatedScoreCard.getKey());
            } 
            obj.setScoreCardKeys(scoreCardKeys);
        }
    }
}

我所能意识到的是,当我使用**findObjectivesByKeys**返回目标时,我返回的是空对象,因此我必须对它们调用makeTransient以启用持久性,否则它们只会忽略makePersistent方法调用

我还注意到,我得到了中空状态的物体。我必须对它们调用maketransient来更新它们吗?如果不提供持久性代码,就不能期望任何人理解这一点。而GAE v1不具备适当的无主关系;这只是一个使用关键字段的黑客。