【发布时间】:2014-05-02 14:26:30
【问题描述】:
我有一个测试 servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
EntityManager em = EMF.get().createEntityManager();
em.getTransaction().begin()
DBManager.getInstance().eraseDB();
em.getTransaction().commit();
em.getTransaction().begin();
if(DBManager.getInstance().createUser("first", "second"))
writer.print("done.");
else
writer.print("failed.");
em.getTransaction().commit();
}
方法eraseDB是:
@SuppressWarnings("unchecked")
public void eraseDB(){
EntityManager em = EMF.get().createEntityManager();
Query q = em.createQuery("select u from User u");
List<User> list = q.getResultList();
for(User u : list){
em.remove(u);
}
}
而createUser的方法是:
public static synchronized boolean createUser(String username, String password) {
EntityManager em = EMF.get().createEntityManager();
Query q = em.createQuery("select u from User u");
@SuppressWarnings("unchecked")
List<User> list = q.getResultList();
if(list.size() > 0)
return false;
User u = new User();
u.setPassword(password);
u.setUsername(username);
em.persist(u);
return true;
}
在 servlet 调用之后,我从 createUser 方法得到了 true,但数据存储是空的。
为什么persist 不起作用?我做错了什么?
欢迎提供有关此架构的任何其他建议,谢谢。
【问题讨论】:
-
您使用第一个实体管理器启动并提交事务,但您使用第二个不同的实体管理器进行持久化。
-
@JBNizet 谢谢。但是,如果我在持久化之前/之后放置一个事务开始/提交,在擦除数据库中的 for 循环之前/之后放置另一个,则存在并发问题(按住 F5 会出现异常或将两个元素放入数据库)
标签: jakarta-ee jpa persistence