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

我一直在使用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中有各种模型嵌入数千个对象时,这绝对不是很好。     

要回复问题请先登录注册