使用每个线程会话对象,只要您不在多个线程之间共享会话对象,就可以了。
您收到的错误与多线程用法或会话管理无关。您
session.save()对ID的使用以及明确设置ID都不正确。
没有看到您的映射
BlogPost很难分辨,但是如果您告诉Hibernate使用该
id字段作为主键,并且您正在使用本机生成器作为主键,那么您要做的就是:
session.beginTransaction();session.persist(b);session.flush(); // only needed if flush mode is "manual"session.getTransaction().commit();
Hibernate将为您填写ID,这
persist()将导致插入发生在事务的范围内(
save()不关心事务)。如果您的冲洗模式未设置为手动,则您无需致电,
flush()因为
Transaction.commit()它将为您处理。
请注意,使用时
persist(),不保证在刷新会话之前就可以设置BlogPost的ID,这对您在此处的用法非常有用。
要优雅地处理错误:
try { session.beginTransaction(); try { session.persist(b); session.flush(); // only needed if flush mode is "manual" session.getTransaction().commit(); } catch (Exception x) { session.getTransaction().rollback(); // log the error }} catch (Exception x) { // log the error}顺便说一句,我建议将其设为
BlogPost.setId()私有或可见。如果另一个类显式设置ID(再次假定本机生成器和id为主键),则很可能是实现错误。



