Я использую Google App Engine в сочетании с Google Web Toolkit для написания трекера ошибок (чтобы увидеть, на что способны технологии).
По образцу трекера проблем Google Code я решил, что проблема может иметь 0 или более меток, которые можно определить заранее (скажем, в настройках).
Класс этикетки (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
}
Теперь родительский класс (выпуск):
@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
}
Когда я пытаюсь сохранить новую проблему с существующими CustomLabels, я получаю следующее исключение:
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.
Как это можно решить? Я не могу использовать ключи и создавать неизвестные отношения, так как я отправляю объекты во внешний интерфейс GWT (который компилируется в Javascript и com.google.appengine.api.datastore.Key не поддерживается). Кроме того, это нарушит ссылочную целостность, что нежелательно.