每当我尝试将其设置为对象属性时,都会创建一个新对象。让某人重现这一点。这是默认行为吗?
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();
}
...
不是将产品类设置为产品,而是生成新的产品类。我究竟做错了什么?
感谢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
上使用。