我的項目是一個用seam-gen生成的WAR項目。它包含了這樣的的RESTEasy Web服務類(簡化,僅相關部分):什麼是從RESTEasy服務正確使用EntityManager? (SEAM,JBoss)
@Scope(ScopeType.APPLICATION)
public abstract class RestService {
@In
protected EntityManager entityManager;
@GET
@POST
@Produces("application/json")
public Object proxy() {
// invokes various subclass methods
// based on request parameters
// and returns the result
}
// further method and logic
}
和:
@Path("/my")
@Name("myRestService")
public class MyRestService extends RestService {
public Object login(/*...*/) {
User user = getUser(email);
// ...
Token token = user.getToken();
if (token != null) {
entityManager.remove(token);
}
token = new Token();
entityManager.persist(token);
user.setToken(token);
user.setLastlogin(new Date());
entityManager.persist(user);
// ...
}
private User getUser(String email) {
try {
return (User) entityManager
.createQuery("FROM User WHERE UPPER(email) = UPPER(:email)")
.setParameter("email", email)
.getSingleResult();
} catch (NoResultException e) {
return null;
}
}
}
如果我通過Web瀏覽器調用登錄方法,找到正確的用戶(基於get參數),爲它實例化一個Token(我可以在Hibernate的STDOUT中看到詢問數據庫的下一個序列),但persist()方法不會將Token保存到數據庫,用戶對象(令牌標識,上次登錄日期)。
我用Google搜索這個現在兩天了,這裏就是我能想出:
我的項目使用Seam管理的事務(components.xml中):
<persistence:managed-persistence-context name="entityManager" auto-create="true" persistence-unit-jndi-name="java:/MyEntityManagerFactory"/>
我的項目用途JTA進行交易處理(persistence.xml):
<persistence-unit name="MyProject" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> ...
the En tityManager.persist()不更改提交到數據庫,只需排隊改變目前的交易(?)
的Seam管理的事務默認
我試圖用綁對話。 flush(),拋出一個異常,說沒有正在進行的事務。
我試圖使用.joinTransaction()和.getTransaction()。begin(),拋出另一個異常,說JTA EntityManager不能訪問事務。
也嘗試在類上使用不同的作用域類型,或在我的login()方法上使用@Transactional註釋,但沒有運氣。
還試圖用@PersistenceContext註釋注入EntityManager,這導致了一個異常,說@PersistenceContext只能用於會話bean。
也試圖將我的課程標記爲@Stateless,導致我無法訪問我的服務(404)。
我應該如何使用EntityManager將我的實體保留在RESTEasy服務中?
系統規格:
- 的JBoss 5.1.0 GA
- SEAM 2.2.1最終
- 的Postgres 8.3
請注意,我完全新的,缺乏經驗的JavaEE帶/ JBoss的/ SEAM。
任何評論將是有用的!謝謝。
我剛剛意識到你寫的是使用Seam 2.另一方面,你使用的是CDI的@Produces?我不確定這兩種技術是否兼容?大概有人可以提供一個提示? –
@Transactional是解決方案,但我需要把它放在代理方法上,而不是在login()上。謝謝! – Istvan