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