我遇到問題。我正在學習JPA。我在單元測試中使用嵌入式OpenEJB容器,但只能工作在@OneToMany(fetch=EAGER)
。否則,集合總是空的。我還沒有發現,懶惰策略是如何工作的,容器如何填充數據以及在哪些情況下觸發容器的加載操作?什麼是懶惰的策略,它是如何工作的?
我已經讀過,這個動作會在getter被調用時觸發。但是當我有代碼:
@OneToMany(fetch = LAZY, mappedBy="someField")
private Set<AnotherEntities> entities = new Set<AnotherEntities>();
...
public Set<AnotherEntities> getEntities() {
return entities;
}
我總是變空。我的事情,懶惰的戰略不能用嵌入式容器進行測試。這個問題也可能是雙向關係。
在JPA測試中是否有其他人類似的expiriences?
附件
真正的測試用例設置:
@RunWith(UnitilsJUnit4TestClassRunner.class)
@DataSet("dataSource.xml")
public class UnitilsCheck extends UnitilsJUnit4 {
private Persister prs;
public UnitilsCheck() {
Throwable err = null;
try {
Class.forName("org.hsqldb.jdbcDriver").newInstance();
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
props.put("ds", "new://Resource?type=DataSource");
props.put("ds.JdbcDriver", "org.hsqldb.jdbcDriver");
props.put("ds.JdbcUrl", "jdbc:hsqldb:mem:PhoneBookDB");
props.put("ds.UserName", "sa");
props.put("ds.Password", "");
props.put("ds.JtaManaged", "true");
Context context = new InitialContext(props);
prs = (Persister) context.lookup("PersisterImplRemote");
}
catch (Throwable e) {
e.printStackTrace();
err = e;
}
TestCase.assertNull(err);
}
@Test
public void obtainNickNamesLazily() {
TestCase.assertNotNull(prs);
PersistableObject po = prs.findByPrimaryKey("Ferenc");
TestCase.assertNotNull(po);
Collection<NickNames> nicks = po.getNickNames();
TestCase.assertNotNull(nicks);
TestCase.assertEquals("[Nick name: Kutyafája, belongs to Ferenc]", nicks.toString());
}
}
的豆Presister
是豆調解訪問實體Bean。類的關鍵代碼如下:
@PersistenceUnit(unitName="PhonePU")
protected EntityManagerFactory emf;
public PhoneBook findByPrimaryKey(String name) {
EntityManager em = emf.createEntityManager();
PhoneBook phonebook = (PhoneBook)em.find(PhoneBook.class, name);
em.close();
return phonebook;
}
實體PhoneBook
是電話簿(也人)一行。一個人可以有零個或更多的暱稱。隨着EAGER策略的運作。隨着LAZY收集是無效的。可能是問題在於分離物體。 (請參閱OpenEJB - JPA Concepts,部分緩存和分離。)但是在手冊中,有時候(更多時候很多時候)這個集合是空的,但不是空的。
你可以用設置,實際測試和拆卸顯示測試嗎? –
在這裏要清楚...你使用的OpenJPA是OpenEJB使用的JPA實現。據我所知,OpenEJB不是JPA實現。 – DataNucleus
是的,我是。我的測試使用嵌入式OpenEJB,OpenEJB使用OpenJPA。 –