gpt4 book ai didi

java - 一对多 child 已经在没有 parent 的情况下被坚持

转载 作者:行者123 更新时间:2023-12-03 20:25:00 24 4
gpt4 key购买 nike

我正在结合使用 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
}

现在是父类(Issue):

@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.

如何解决?我无法使用 Key 并创建无主关系,因为我将对象发送到 GWT 前端(编译为 Javascript 并且不支持 com.google.appengine.api.datastore.Key)。除此之外,这会破坏参照完整性,这是不可取的。

最佳答案

您不能将已存在的 CustomLabel 作为子元素分配给新问题。由于 datanucleus 处理关系的方式,每个 CustomLabel 实体只能属于一个 Issue 对象。它将父对象和子对象放入同一个实体组中。一个实体只能属于一个实体组。因此,假设您创建了一个名为“nastybug”的自定义标签并将其保留。它现在属于某个实体组 X。当您创建一个新问题并坚持下去时,它将属于某个实体组 Y。Datanucleus(和实际的谷歌数据存储)不会让您尝试存储来自组的实体X 进入 Y 组。

如果您希望在问题之间共享标签,则需要使用无主关系。您不能通过 GWT 的 RPC 机制传递 key 是正确的,因此您可能需要在发送之前将 JDO 对象转换为其他形式。

您可以阅读有关实体组的信息 here

关于java - 一对多 child 已经在没有 parent 的情况下被坚持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1158919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com