我是Hibernate新手,正在开发一个servlet,它从URL获取参数,创建一个Hibernate对象,然后将其存储到MySQL数据库中。
我同时发送 1000 个 URL。当我查看MySQL表时,它仅将最后一个对象添加到数据库中。
doGet 方法:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//HttpSession session = request.getSession(true);
//session.putValue("uid", count);
String id = request.getParameter("id");
String url = request.getParameter("url");
String lastVisitTime = request.getParameter("lastVisitTime");
String visitCount = request.getParameter("visitCount");
String title = request.getParameter("title");
String typedCount = request.getParameter("typedCount");
HistoryItem hi = new HistoryItem(id, url, lastVisitTime, visitCount, title, typedCount);
File f = new File("C:\Users\atılay\Desktop\apache-tomcat-7.0.30-windows-x64\jspservlets\UserModeling\src\hibernate.cfg.xml");
SessionFactory sessionFactory = new Configuration().configure(f).buildSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(hi);
session.getTransaction().commit();
session.flush();
session.close();
}
历史项目:
public class HistoryItem {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Basic(optional = false)
private int i;
private String id = "";
private String url = "";
private String lastVisitTime = "";
private String visitCount = "";
private String title = "";
private String typedCount = "";
}
问题出在哪里?我找不到任何解决方案。
如果要创建要保存到数据库中的对象/实体,则不应设置其ID。
分配ID发生在保存对象时 - 这是Hibernate的责任。已设置 ID 表示 HB 认为对象已保存。
实际上,这不是一个非常好的问题,或者编码风格或示例。
"同时发送 1000 个 URL"。 那是什么意思?您一次打开了 1000 个浏览器,并同时从所有浏览器发送请求?说话有道理。
您的 SessionFactory 应该保存在 webapp 或 servlet 中。此代码正在为每个页面请求执行整个Hibernate启动和初始化。
File f = new File("C:\Users\atılay\Desktop\apache-tomcat-7.0.30-windows-x64\jspservlets\UserModeling\src\hibernate.cfg.xml");
SessionFactory sessionFactory = new Configuration().configure(f).buildSessionFactory();
摆脱"ID"作为参数 - 或者可以选择使用它来加载和编辑记录 - 并正确执行Hibernate设置。
然后,您的项目可能会起作用。