设置1-1与现有对象的关系是否使用JDO插入新对象?

时间:2017-12-30 21:07:28

标签: java neo4j jdo datanucleus

每当我尝试将其设置为对象属性时,都会创建一个新对象。让某人重现这一点。这是默认行为吗?

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。我做错了什么?

1 个答案:

答案 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