All*_*lan 3 java orm persistence design-patterns jpa
我正在调查使用JPA作为我的数据访问代码.我正在尝试编写业务层和数据访问层,以便它可以在Web应用程序和Java SE应用程序中工作.因此我不能使用容器管理的持久化上下文.我使用JPA的大部分内容都在容器管理环境中显示了示例.
目前,每当我创建服务类的新实例时,我都会获得EntityManagerFactory.对于每个操作(即添加,获取等),我打开一个EntityManager,启动事务执行操作,提交然后关闭EntityManager和EntityManagerFactory.我希望在Java EE环境之外有一个manged持久化上下文的好处.
不使用容器管理上下文时是否有任何最佳实践?是否有任何Java EE独立持久化上下文管理器?有推荐的模式吗?
谢谢,
人
更新
感谢eveyone的信息.一切都非常有用.
我不确定这方面的最佳实践,但我花了很多时间尝试做这样的工作.
基本上你需要一些东西来构建一个EntityManager.我一直用Spring来做这件事.他们的文档有很大的部分.您可以选择使用LocalEntityManagerFactoryBean,在这种情况下,标记看起来像(来自上述文档):
<bean id="myEmf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myPersistenceUnit"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
原则上,这是不鼓励的,因为当您稍后尝试更改数据源时,它会再次困扰您.但是,我发现对于大多数特定大小的Web应用程序来说,你很可能会遇到这种局限性.
然后,可以通过持久性单元中的hibernate特定属性(META-INF /目录中的persistence.xml)来完成数据源的配置:
<property name="hibernate.connection.driver_class" value="com.company.driver" />
<property name="hibernate.connection.url" value="some:jdbc@string" />
<property name="hibernate.connection.username" value="myuser" />
<property name="hibernate.connection.password" value="mypassword" />
Run Code Online (Sandbox Code Playgroud)
要使用它,如果你还没有使用spring,你可以EntityManagerFactory从应用程序上下文中获取一个实例并从那里开始(即context.getBean("myEmf")).
可以进行更多控制LocalContainerEntityManagerFactoryBean,这可以让您配置数据源.原则上,文档中的示例应该可以工作,但我发现当我这样做时,我必须指定Hibernate持久性提供程序.你需要一个persistence.xml,但它实际上只需要一个默认的持久性单元和非常基本的配置(也许需要识别方言,例如,如果你正在使用带有oracle 10g的hibernate):
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="myDatasource" />
<property name="persistenceProvider">
<bean class="org.hibernate.ejb.HibernatePersistence" />
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
春季文档中有关于如何BasicDataSource从Apache dbcp配置的示例,这也将为您提供连接池.
至于最佳实践,JPA在完整的应用程序服务器环境之外实际上并不容易.在尝试调整性能时会遇到各种各样的问题,您会发现自己对于JPA中无法使用的Hibernate功能垂涎三尺,并且您的查询很可能最终不会严格遵守JPA规范.如果您没有使用容器管理,那么直接使用Hibernate API可能会更容易和更安全.
| 归档时间: |
|
| 查看次数: |
5632 次 |
| 最近记录: |