每当我尝试将其设置为对象属性时,都会创建一个新对象。让某人重现这一点。这是默认行为吗?
public class ProductClass implements Serializable {
...
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
long id;
@Persistent
private String name = null;
...
}
public class Product implements Serializable {
...
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
long id;
@Persistent
private String name = null;
@Persistent(defaultFetchGroup = "true")
private ProductClass productClass = null;
...
}
这是我通过实施ProductClass
;
ProductClassNeo4jService
的方法
@Override
public ProductClass findById(Long id) {
if (id == null) {
return null;
}
PersistenceManager pm
= JDOUtil.PERSISTENCE_MANAGER_FACTORY.getPersistenceManager();
ProductClass prod = null;
try {
prod = (ProductClass) pm.getObjectById(ProductClass.class, id);
} finally {
pm.close();
}
return prod;
}
...
ProductClass prodClass = productClassNeo4jService.findById(id);
坚持这样的产品;
...
Product prod = new Product();
prod.setName('productName');
prod.setProductClass(prodClass);
PersistenceManager pm = JDOUtil.PERSISTENCE_MANAGER_FACTORY.getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
tx.begin();
pm.makePersistent(prod);
Object id = pm.getObjectId(prod);
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
pm.close();
}
...
不是将ProductClass设置为Product,而是生成新的ProductClass。我做错了什么?
答案 0 :(得分:0)
感谢JDO 2.0提供的名为 attach / detach 的功能,该功能允许分离对象以供在其他地方使用,然后在想要在对象中保留任何已更改的数据时附加它们。我获得的ProductClass
没有分离就没用了。感谢@ DN1。我修改了我的代码以通过添加一行来分离ProductClass。
看起来像这样;
@Override
public ProductClass findById(Long id) {
if (id == null) {
return null;
}
PersistenceManager pm
= JDOUtil.PERSISTENCE_MANAGER_FACTORY.getPersistenceManager();
Transaction tx = pm.currentTransaction();
ProductClass prod = null;
try {
tx.begin();
prod = (ProductClass) pm.getObjectById(ProductClass.class, id);
// Detach our productClass object for use elsewhere
prod = pm.detachCopy(prod);
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
pm.close();
}
return prod;
}
为方便起见,将javax.jdo.option.DetachAllOnCommit = true
添加到您的PMF选项中。
实际问题是我在交易之外做了所有这些。
将javax.jdo.option.DetachAllOnCommit
添加到persistence.xml
仅适用于Transaction
。