【发布时间】:2015-05-01 11:22:02
【问题描述】:
我试图使用持久性和 servlet guice 扩展在 Jetty 上让简单的 webapp 与 Guice 和 JPA 一起工作。
我写了这个Service实现类:
public class PersonServiceImpl implements PersonService {
private EntityManager em;
@Inject
public PersonServiceImpl(EntityManager em) {
this.em = em;
}
@Override
@Transactional
public void savePerson(Person p) {
em.persist(p);
}
@Override
public Person findPerson(long id) {
return em.find(Person.class, id);
}
@Override
@Transactional
public void deletePerson(Person p) {
em.remove(p);
}
}
这是我的 servlet(带有 @Singleton 注释):
@Inject
PersonService personService;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String name = req.getParameter("name");
String password = req.getParameter("password");
String email = req.getParameter("email");
int age = Integer.valueOf(req.getParameter("age"));
Person p = new Person();
p.setAge(age);
p.setName(name);
p.setEmail(email);
p.setPassword(password.toCharArray());
logger.info("saving person");
personService.savePerson(p);
logger.info("saved person");
logger.info("extracting person");
Person person = personService.findPerson(p.getId());
resp.getWriter().print("Hello " + person.getName());
}
当我运行它时,它可以工作,并且我将名称发送到客户端,但是当我查看日志时,我看到没有为插入生成 DML,并且从 postgresql 选择不返回任何结果,这意味着它并没有真正坚持下去。
我调试了代码,发现JpaLocalTxnInterceptor 调用了txn.commit()。
然后我对PersonServiceImpl 进行了更改并使用Provider<EntityManager> 而不仅仅是EntityManager,它按预期工作。现在我真的不明白为什么,这可能是因为我并不真正理解 Provider 背后的想法。
在Guice wiki page 上面写着:
请注意,如果您将 MyService 设为 @Singleton,则应改为注入 Provider。
但是,我的 PersonServiceImpl 不是 @Singleton,所以我不确定它为什么适用,也许是因为 Servlet?
如果您能帮我解决这个问题,我将不胜感激。
【问题讨论】:
标签: java jpa guice guice-servlet guice-persist