Объект не сохранен для отношения «Неизвестные многие ко многим» - PullRequest
1 голос
/ 22 ноября 2011

В JDO у меня установлена ​​неизвестная связь «многие ко многим», добавив список в оба объекта «Persistence Capable». Для объяснения моей проблемы давайте назовем эти две сущности.

EntityA и EntityB

Теперь, когда у меня есть новый объект EntityB, который необходимо присоединить к объекту EntityA, я добавляю этот ключ к объекту EntityA и вызываю на нем makePersistent, который сохраняет объект. Я проверил это, напечатав его на консоли.

Поскольку это отношение «многие ко многим», я должен сделать то же самое и на другом конце отношения. Итак, я выбираю все объекты EntityB, на которые ссылается EntityA, используя выберите из «+ clazz.getName () +» где: keys.contains (ключ) и передав ему список ключей, присутствующих в объекте EntityA.

Проблема, с которой я сталкиваюсь, состоит в том, что возвращаемые объекты являются полыми, и поэтому они не сохраняются в хранилище данных, даже если я добавляю ключи EntityA к извлеченным объектам.

Я новичок в JDO и GAE, и столкнулся с этой проблемой со вчерашнего дня. Может кто-нибудь, пожалуйста, пролить свет на это? Я могу предоставить пример кода, если это необходимо.

1 Ответ

0 голосов
/ 22 ноября 2011

Вот код

@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

Объекты «Цель» и «Карта результата» находятся в неизвестном отношении «Многие ко многим»

Вот метод обработки, который обновит карту результата.

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

// При этом используется запрос выбора из "+ clazz.getName () +" где: keys.contains (ключ)

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

Все, что я смог реализоватьв том, что когда я возвращаю Objectives, используя **findObjectivesByKeys**, я возвращаю пустые объекты, поэтому мне приходится вызывать makeTransient для них, чтобы они оставались постоянными, иначе они просто игнорируют makePersistent вызов метода.

...