在Java桌面应用程序中进行数据库访问的最佳方法

时间:2011-01-28 13:50:56

标签: java database jpa java-ee-6

我一直在使用Glassfish 3,JPA和Java EE 6.在Web容器中,您可以将实体管理器注入EJB并让它处理您的事务,回滚等。我在桌面上做什么应用。显然这不起作用。我知道我仍然会将JPA用于ORM。但是我会创建一个EntityMangerFactory,然后从中创建一个Entitymanager吗?我是否必须手动处理我的交易?如果我能看到一些示例应用程序,那就太好了。谢谢!

5 个答案:

答案 0 :(得分:3)

EntityManagerFactory entityManagerFactory = 
     Persistence.createEntityManagerFactory("DS");
em = entityManagerFactory.createEntityManager();

如果您不使用spring-framework或其他内容,则必须通过调用em.getTransaction.begin()em.getTransaction.commit()来处理事务。

答案 1 :(得分:2)

我建议尝试使用Spring + JPA,在那里你不需要容器,它只是应用程序上下文,你可以在那里配置事务。 您不会处理这些交易,只需注释您希望成为@Transactional的方法。

答案 2 :(得分:2)

您可以使用Spring,这将为您带来从JEE6到桌面应用程序的知识。 (当然它不是100%相同!)

答案 3 :(得分:1)

另一种选择可能是使用所谓的Embeddable EJB Container。它可以为您提供与您可能习惯的注射,CMT等相同的服务。

答案 4 :(得分:1)

我使用Hibernate和Swing构建了一个2层Java Swing客户端,我再也不会这样做了。如果我今天必须重建它,我会使用原始的JDBC查询,或者像iBatis这样非常简单的ORM映射框架。

Hibernate(我假设其他JPA实现,虽然我的体验仅限于Hibernate)在桌面环境中如此不同的原因是1)因为对象在桌面上的寿命往往更长,2)它是很难知道何时访问对象,因此延迟加载的正确事务处理是有问题的。

Web请求 - 响应范例基本上是事务性的,因此在那里划分您的事务非常容易。在桌面上,每个按键,甚至只是一个MouseMovedEvent,都可能触发数据库查询或延迟加载,因此要知道何时启动和提交事务要困难得多。

错误处理和对象刷新是一个大问题,因为对象往往具有更长的寿命(通常在应用程序启动期间)。在Hibernate中,异常是不可恢复的,这意味着您应该从db重新加载所有内容。这在网络上很好,但是当你在整个GUI中有各种模型嵌入数千个对象时,这绝对不是很好。

相关问题