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

问题描述 投票:0回答:1

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

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();
}
...

不是将产品类设置为产品,而是生成新的产品类。我究竟做错了什么?

java neo4j jdo datanucleus
1个回答
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上使用。

© www.soinside.com 2019 - 2024. All rights reserved.