首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JDO将所有字段保持为null。

JDO将所有字段保持为null。
EN

Stack Overflow用户
提问于 2014-01-05 18:10:27
回答 1查看 344关注 0票数 0

我有以下情况:

“帐户”类,它应该包含“货币”对象的集合。

代码语言:javascript
复制
@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;

“金钱”类看起来是这样的:

代码语言:javascript
复制
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(.))。我希望通过这种方式将货币对象也存储起来。这实际上是真的,但是所有的对象字段都是空的。

这个测试用例显示了这个问题:

代码语言:javascript
复制
    @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例外:

代码语言:javascript
复制
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]]>

编辑:

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

代码语言:javascript
复制
/**
 * 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;
    }
}

对于对象检索:

代码语言:javascript
复制
/**
 * 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();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-05 22:52:20

我已经找到了解决这个问题的办法。

关于JDO如何管理对象生命周期的一些背景信息:transition.html

解决方案本身:

代码语言:javascript
复制
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();
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20937219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档