J'utilise Google App Engine en combinaison avec Google Web Toolkit pour écrire un outil de suivi des bogues (pour voir de quoi les technologies sont capables). Modelé d'après le traqueur de problème de Google Code, j'ai décidé qu'un problème peut avoir 0 ou plusieurs étiquettes, qui peuvent être définies au préalable (disons dans les paramètres).L'enfant un-à-plusieurs a déjà été conservé sans parent
La classe d'étiquettes (CustomLabel):
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class CustomLabel implements Serializable {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String encodedKey;
@Persistent
@Extension(vendorName="datanucleus", key="gae.pk-id", value="true")
private Long keyId;
/**
* label caption.
*/
@Persistent
private String caption;
// Unimportant getters/setters
}
Maintenant la classe parente (numéro):
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Issue implements Serializable {
private static final long serialVersionUID = 1L;
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
// Replacing the Long key by this key doesn't make a difference
// @PrimaryKey
// @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
// @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
// private String encodedKey;
@Persistent
private String summary;
@Persistent
private String description;
@Persistent
private ArrayList<CustomLabel> labels;
// Other details
}
Quand je suis en train de persister un nouveau problème avec CustomLabels existants que je reçois ce qui suit exception:
org.datanucleus.exceptions.NucleusUserException: Detected attempt to establish Issue(11) as the parent of CustomLabel(1) but the entity identified by CustomLabel(1) has already been persisted without a parent. A parent cannot be established or changed once an object has been persisted.
Comment cela peut-il être résolu? Je ne peux pas utiliser Key et créer une relation sans propriétaire, puisque j'envoie les objets à l'interface GWT (qui est compilé en Javascript et com.google.appengine.api.datastore.Key n'est pas supporté). En outre, cela briserait l'intégrité référentielle, ce qui n'est pas souhaitable.
Merci, qui explique beaucoup , même si c'est un peu bizarre, ayant un arrière-plan db relationnel :) – Mythica