Мой проект - это проект WAR, созданный с помощью seam-gen. Он содержит такой класс веб-службы RESTEasy (упрощенно, только соответствующие части):
@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;
}
}
}
Если я вызываю метод входа в систему через веб-браузер, он находит правильного пользователя (на основе параметров get), создает для него токен (я вижу в STDOUT Hibernate, запрашивающего базу данных для следующей последовательности), но сохраняется () не сохраняет токен в базе данных, ни модификации объекта User (идентификатор токена, дата последнего входа в систему).
Я гуглил это уже два дня, вот что я мог выяснить:
мой проект использует управляемые транзакции 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> ...
EntityManager.persist () НЕ фиксирует изменения в базе данных, просто ставит в очередь изменения текущей транзакции (?)
транзакции, управляемые SEAM, по умолчанию привязаны к диалогам
Я попытался использовать .flush (), было выдано исключение о том, что транзакция не выполняется.
Я попытался использовать .joinTransaction () и .getTransaction (). Begin (), возникло другое исключение, в котором говорилось, что JTA EntityManager не может получить доступ к транзакциям.
Также пытался использовать разные типы области в классе или использовать аннотацию @Transactional в моем методе login (), не повезло.
Также попытался внедрить EntityManager с аннотацией @PersistenceContext, это привело к исключению, в котором говорилось, что @PersistenceContext можно использовать только с сессионными компонентами.
Также попытался пометить мой класс как @Stateless, в результате я не смог связаться со своим сервисом (404).
Как мне сохранить свои объекты в службе RESTEasy с помощью EntityManager?
Системные характеристики:
- JBoss 5.1.0 GA
- ШОВ 2.2.1 Финал
- Postgres 8.3
Обратите внимание, что я совершенно новичок и не знаком с JavaEE / JBoss / SEAM.
Любой комментарий был бы полезен! Спасибо.