使用每个线程会话对象,只要您不在多个线程之间共享会话对象,就可以了。
您收到的错误与多线程用法或会话管理无关。您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为主键),则很可能是实现错误。