繁体   English   中英

JDO将所有字段都保留为null

[英]JDO persists all fields as null

我有以下情况:

一个“ Account”类,其中应包含“ Money”对象的集合。

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

    @Expose
    @Persistent
    private String name;

    /**
     * The initial balance should be a portfolio, e.g. 300 BGN, 230 EUR etc.
     */
    @Expose
    @Persistent
    private List<Money> initialBalancePortfolio;

“ Money”类的外观如下:

public class Money {
    @Persistent
    @Extension(vendorName = "datanucleus", key = "gae.unindexed", value = "true")
    private BigDecimal ammount;

    @Persistent
    private String currency;

问题来了:

  1. 我不希望所有货币实例都有单独的表格。 我尝试使用@Embedded注释来实现它,但是由于initialBalancePortfolio无法自身嵌入(集合),因此无法实现。
  2. 我放弃了尝试尝试存储帐户对象(pm.makePersistent(...))。 我希望通过这种方式也可以存储金钱对象。 确实是这样,但是所有对象字段均为空。

此测试案例显示了问题:

    @Test
    public void initialBalancePortfolioShouldBePersisted() throws Exception {
        //create
        Account account = createAccount();
        AccountDao accountDao = new AccountDao();
        accountDao.create(account);
        //get it with new dao
        AccountDao newAccountDao = new AccountDao();
        Account newAccount = newAccountDao.readAll().get(0);
        assertEquals(account.getInitialBalancePortfolio(), newAccount.getInitialBalancePortfolio());
    }

    private Account createAccount() {
        //create list with money
        List<Money> money = new ArrayList<Money>();
        Money m1 = new Money(23, "BGN");
        Money m2 = new Money(21, "EUR");
        money.add(m1);
        money.add(m2);
        //create account 
        Account account = new Account(accEntity, money, "xxx");
        return account;
    }

和JUnit异常:

java.lang.AssertionError: expected:<[Money [ammount=23, currency=BGN], Money [ammount=21, currency=EUR]]> but was:<[Money [ammount=null, currency=null], Money [ammount=null, currency=null]]>

编辑:

用于创建对象的持久性代码:

/**
 * Create entity. entityDao.create(entity);
 * 
 * @param t
 *            Entity
 * @return operations success
 */
public boolean create(T t) {
    if (t.getId() == null) {
        PersistenceManager pm = PMF.getInstance().getPersistenceManager();
        try {
            pm.makePersistent(t);
            LOGGER.info(getEntityClass() + " created!");
            return true;
        } finally {
            pm.close();
        }
    } else {
        LOGGER.info(getEntityClass() + " already exist! Update only!");
        update(t);
        return false;
    }
}

对于对象检索:

/**
 * Get all existing objects.
 * 
 * @return
 */
public List<T> readAll() {
    PersistenceManager pm = PMF.getInstance().getPersistenceManager();
    try {
        pm.getFetchPlan().setGroup(FetchGroup.ALL);
        Query q = pm.newQuery(getEntityClass());
        @SuppressWarnings("unchecked")
        List<T> allEntities = (List<T>) q.execute();
        return allEntities;
    } finally {
        pm.close();
    }
}

我找到了解决该问题的方法。

有关JDO如何管理对象生命周期的一些背景信息: http : //db.apache.org/jdo/state_transition.html

解决方案本身:

PersistenceManager pm = PMF.getInstance().getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
    tx.begin();
    pm.makePersistent(t);
    tx.commit();
} catch (Exception e) {
    LOGGER.severe("Exception by creating a new entity "
            + e.getMessage());
    tx.rollback();
} finally {
    pm.close();
}

如您所见,我正在使用事务来确保对象处于有效状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM