我正在努力建立一个论坛系统作为大学任务的一部分, 其中包含数据库连接部分。 我在java中编写服务器并决定使用hibernate作为ORM工具来保存和加载数据库。 我的问题不是关于语法,而是关于整个系统关于数据库的设计。
答案 0 :(得分:2)
理想情况下,框架应该为您做到这一点。例如,使用Spring,您可以使用注释简单地标记Spring bean事务的方法,并且会话和事务处理将由Spring完成:
@Autowired
private SessionFactory sessionFactory;
@Transactional
public void foo() {
Session session = sessionFactory.getCurrentSession();
// do some work with the session
}
而不是
private SessionFactory sessionFactory;
public void foo() {
Session sess = sessionFactory.openSession();
Transaction tx = null;
try {
tx = sess.beginTransaction();
// do some with the session
tx.commit();
}
catch (RuntimeException e) {
if (tx != null) {
tx.rollback();
}
throw e;
}
finally {
sess.close();
}
}
每次更改后都不应该提交,也不应该每次都进行一些更改。你应该进行原子的,连贯的改变。这就是事务的全部要点:能够从数据库的连贯状态转到数据库的另一个连贯状态。
例如,如果将消息发布到主题论坛,则包含
然后这三个更改应该在一个事务中,以确保您不会以持久化的消息结束,但messageCount不会增加。
答案 1 :(得分:0)
我建议您将创建和提交事务留给容器,除非您确定要自己执行此操作。在这种情况下,您可以使用JTA,并使用容器管理事务(CMT)。还要记住要避免使用entitymanager-per-operation反模式。要了解更多信息,请阅读Transactions and Concurrency并确定适合自己的最佳方式。
答案 2 :(得分:0)
看一下DAO(数据访问对象)模式。它将有助于提供一种模式,帮助您封装数据访问。
http://en.wikipedia.org/wiki/Data_access_object
此外,这个页面做得很好: Data access object (DAO) in Java
关于第二个问题,答案完全取决于您的要求。通常,您希望每次用户交互至少提交一次。这可能是几次内存中更改的结果。在每个实体更改后,提交肯定更容易。