我通过Hibernate会话在多线程模式下使用PostgreSQL。初始化:
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.current_session_context_class">thread</property>
(其他字符串是连接URL和实体xml描述)
HibernateUtil:
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
Configuration configuration = new Configuration();
configuration.configure();
sessionFactory = configuration.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession() {
return sessionFactory.getCurrentSession();
}
public static void close() {
sessionFactory.close();
}
public static void setSessionFactory(SessionFactory factory) {
sessionFactory = factory;
}
}
所有带有实体i的CRUD动作都在单独的类中执行,其中每个动作都在一个事务中执行。
public class SessionService {
public static <T> T get(Class<T> classvar, int id) {
Session session = HibernateUtil.getSession();
session.beginTransaction();
T result = session.get(classvar, id);
session.getTransaction().commit();
return result;
}
// Some other code
public static void update(Object obj) {
Session session = HibernateUtil.getSession();
session.beginTransaction();
session.update(obj);
session.getTransaction().commit();
}
}
多线程工作没有问题(或者我看不到)。但是,前段时间我看到了一个奇怪的错误。我通过SessionService.get(Entity.class,1)从数据库获得了一条记录。更改此实体的一个字段,并通过SessionService.update(entity)保存它。更新已成功完成,没有任何异常(已批准记录)。但是更改未在数据库中看到。在运行时实体中有此更改,但在db中没有。我等了一段时间(等冲洗),但是什么都没有改变。
试图重复错误-一切都很好,没有找到错误。有一天,我在生产服务器上用200个中的19个对象捕获了此错误,但在另一天中,我没有看到此错误。
最后一个重要时刻:我t catched this bug with other entities (or i don
看不到他们)。
可能是什么原因?最好使用实体管理器代替会话?
答案 0 :(得分:0)
可以请您发布整个hibernate.cfg.xml文件(当然要删除用户名和密码)。 您还100%确定不会收到类似(错误猜测)的错误: 具有相同标识符值的另一个对象已与会话关联?
运行Hibernate时出错,运行查询时,文学文字在控制台中闪烁半秒钟。 前一段时间有这个问题。