4
我們正在研究由Spring Roo
生成的GWT項目,但我們不再使用Roo
來編輯/生成類。相反,我們現在手動編寫所有東西。瞭解Spring Roo爲GWT生成的實體代碼
對於每個服務器端實體類Roo生成相當不可思議的EntityManager
獲取代碼。不得不保持它,我想理解它,但我不知道。下面是從生成的實體代碼片段:
@PersistenceContext
transient EntityManager entityManager;
public static final EntityManager entityManager() {
EntityManager em = new Scenario().entityManager;
if (em == null)
throw new IllegalStateException(
"Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)");
return em;
}
@Transactional
public void persist() {
if (entityManager == null)
entityManager = entityManager();
entityManager.persist(this);
}
public static List<Scenario> findAllScenarios() {
List<Scenario> res = entityManager().createQuery(
"select o from Scenario o order by o.name",
Scenario.class).getResultList();
return res;
}
public static Scenario findScenario(Long id) {
if (id == null)
return null;
return entityManager().find(Scenario.class, id);
}
我的意見和問題:
- 實例方法使用
EntityManager
場由Spring注入,這是很清楚。但爲什麼這件作品是:if(entityManager == null) entityManager = entityManager();
?難道我們excpect是EntityManager
在em
領域應注射,不能null
(或別的東西是錯誤的?) - 的靜態方法創建實體的新實例,並獲得其
EntityManager
場,爲什麼呢?不能是EntityManager
緩存在靜態字段或類似的東西? - 爲什麼像
findAllXXX
這樣的讀取方法不是@Transictional
?據我所知,根據JPA規範,所有JPA操作應該在交易的邊界內完成? - 是
if (id == null) return null;
件在findXXX
方法真的有必要嗎?如果我們得到空作爲id
參數來顯示出現問題,我們是不是應該崩潰應用程序? - 我們可以用更優雅的方式重寫這個
EntityManager
採集代碼嗎(例如沒有那個奇怪的new Entity().entityManager
的東西)但是不會破壞它(可能有一些前提條件需要保留)? - 爲什麼
EntityManager
字段transient
?這很重要嗎?