gpt4 book ai didi

java - GAE 数据存储将不会持久拥有 1 :1 relationship within embedded JDO class

转载 作者:行者123 更新时间:2023-12-01 04:42:29 25 4
gpt4 key购买 nike

我有三个@PC 类:

@PersistenceCapable
class A {
@PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String id;

@Persistent @Embedded
private B b;

public void setB(B b){
this.b=b;
}
}

@PersistenceCapable @EmbeddedOnly
class B {
@Persistent
private String someInfo;
@Persistent
private C c;

public void setC(C c){
this.c=c;
}
}

@PersistenceCapable
class C {
@PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String id;

@Persistent
private String value;

public void setValue(String value){
this.value=value;
}
}

我想实现 B 持久化到与 A 相同的实体,同时保留对 C 的引用,但 GAE 不允许我这样做,我在提交时遇到以下异常:

Detected attempt to establish A(1) as the parent of C(2) but the entity identified by C(2) has already been persisted without a parent.  A parent cannot be established or changed once an object has been persisted.

在此代码中:

A a = new A();
B b = new B();
C c = new C();
c.setValue("foo");
b.setC(c);
a.setB(b);

m.makePersistent(a);

此外:查看 DatastoreViewer 后我发现 C 已被保留!但A不见了。可能会发生这种情况,因为我没有在异常时显式回滚事务,这与本例无关,但显示 C 是在其父级 A 之前写入的。

我错过了什么?发送

更新2:

按照建议,我已明确启用事务:

Transaction tx = pm.currentTransaction();
try {
tx.begin();
pm.makePersistent(a);
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
pm.close();
}

与在没有显式事务的情况下执行 .makePersistent() 时抛出相同的异常。然后我在 JDO 配置中设置禁用全局交叉发送选项:

<property name="datanucleus.appengine.datastoreEnableXGTransactions" value="false"/>

现在得到一个不同的异常,并带有可能的提示:

cross-group transaction need to be explicitly specified, see 
TransactionOptions.Builder.withXGfound both Element {
type: "A"
id: 1
}
and Element {
type: "C"
id: 2
}

最佳答案

我认为如果您设置事务边界以使其正常工作,问题就会消失。虽然documentation声称您所做的事情应该是可能的,我假设您已在 jdoconfig.xml 中将 datanucleus.appengine.autoCreateDatastoreTxns 设置为 true
因此,C 存储在它自己的事务中,并具有它自己的实体组。在第二个事务中,您存储 A 并因此尝试将 C 重新分配给 A 的实体 groupy,这是禁止的:

because entity groups can only be assigned when the entities are created

所以:设置一个交易(按照建议)。

关于java - GAE 数据存储将不会持久拥有 1 :1 relationship within embedded JDO class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16293172/

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