Мой проект - проект 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, запрашивая базу данных для следующей последовательности), но метод persist () не сохраняет токен в базе данных и не изменяет объект 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.
Любой комментарий будет полезен! Благодаря.