|
|
曾深爱过的沙滩裤 · Range.GoTo method ...· 4 月前 · |
|
|
留胡子的黄豆 · WPF ToggleButton ...· 1 年前 · |
|
|
茫然的黑框眼镜 · Graphql API fails ...· 2 年前 · |
|
|
豁达的木耳 · 在添加.text属性时,得到一个Attrib ...· 2 年前 · |
我有以下情况:
“帐户”类,它应该包含“货币”对象的集合。
@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;
“金钱”类看起来是这样的:
public class Money {
@Persistent
@Extension(vendorName = "datanucleus", key = "gae.unindexed", value = "true")
private BigDecimal ammount;
@Persistent
private String currency;
问题来了:
这个测试用例显示了这个问题:
@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();
}
发布于 2014-01-05 22:52:20
我已经找到了解决这个问题的办法。
关于JDO如何管理对象生命周期的一些背景信息: transition.html
解决方案本身:
PersistenceManager pm = PMF.getInstance().getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
tx.begin();
pm.makePersistent(t);
tx.commit();
} catch (Exception e) {