繁体   English   中英

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

[英]Best way to do database access in a Java desktop application

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM