下面是代碼
@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);
}
}
}
所有我已經能夠認識到的是,當我使用**findObjectivesByKeys**
取回目標我正在回到空心物體,所以我必須調用makeTransient對它們進行持久化,否則它們只會忽略makePersistent方法調用。
另外我注意到的是我回到中空狀態的物體。我必須給他們打電話maketransient更新他們嗎? – Hrishikesh
如果你不提供持久代碼,你不能指望任何人明白這一點。而GAE v1並沒有做適當的「無主」關係;它只是使用Key字段進行破解。 – DataNucleus
好的,這是我的代碼... – Hrishikesh