我是Hibernate新手,开发一个从URL获取参数的servlet,创建一个Hibernate对象,然后将其存储到MySQL数据库中。
我正在同时发送1000个网址。当我查看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();
}
HistoryItem:
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 = "";
}
有什么问题?我找不到任何解决方案。
答案 0 :(得分:0)
如果您要创建要保存到数据库中的对象/实体,则不应设置它的ID。
在保存对象时会发生ID分配 - 这是Hibernate的责任。已经设置了ID,意味着HB认为该对象已经被保存。
真的,这不是一个非常好的问题,或编码风格或示例。
'同时发送1000个网址'。那是什么意思?您一次打开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设置。
然后你的项目可能有用。