JPA Best Practices [1]
转自:http://dev2dev.bea.com.cn/blog/mikecool/200711/jpa_persistence_22_699.html
这是一些我从个人收集和整理的一些JPA Best Practices,部分内容引自Java EE Blueprint和Patrick Linskey(OpenJPA Dev Leader)在Spring One的演讲。
分离ORM MetaData
JPA Metadata有两大类,一类是描述Entity之间的关系,而另一类是描述Entity到数据库的映射关系。
众所周知,应用JPA的Metadata有两个途径:Annotation和XML。在这里我不对两者的优劣进行比较。我们着眼的是JPA,JPA在Spec中强调的一点是可移植性的应用,这就意味着使用JPA的应用程序要有比较强的移植能力。如何达到这一点呢?
Patrick的建议是用Annotation描述Entity关系,用XML描述数据库映射。好处很明显,即通过不同的XML增强了应用程序的可移植性。也没有丢失Annnotation的自释性,让开发者在开发过程中一目了然。
不过,我想补充的是,Annotation相对于XML效验的限制性相对小,所以灵活性会更大。例子是尝试在Embedded
Object里面用GeneratedValue,这个在XML里面是无法完成的,Annotation是支持的,至少我常用的OpenJPA也能够在功
能上完全支持。
使用em.getReference减少不必要的操作
Patrick提到这个方法可以在某些特定的场景下减少不必要的数据库操作,以达到提高性能的目的。
首先看getReference做了什么,在JavaDoc中定义了"获取一个实例,其状态是延迟读取的"。我一开始也没有注意到这个方法,因为我没有想到什么地方可以用这个。Patrick提供了一些很好的例子:
- em.remove(em.getReference(Entity.class, EntityId))
- em.lock(em.getRefenece(Entity.class, EntityId), LockMode)
相比较传统的em.find,其作用不言而喻。em.getReference不会真正去做数据库的select,而是假装把Entity的实例给
你了。等你真正去做相应操作的时候由JPA
Implementation决定如何去读。就上面的例子来说,OpenJPA就不会去做Select了。相比较SQL就会看到:
操作 |
SQL |
em.remove(em.getReference(Entity.class, EntityId)) |
delete from Entity where id = EntityId. |
em.remove(em.find(Entity.class, EntityId)) |
select * from Entity where id = EntityId
delete from Entity where id = EntityId. |
而SELECT对于remove来说这是不怎么必要,当Entity比较大的时候相当明显。
应当注意到getReference也不能乱用,因为潜在的EntityNotFoundException会在第一次访问的时候抛出来,这就会增
加系统的复杂性,有时候得不偿失。另外对于将用于Detached状态的Instance,getReference也不适用。
使用JPA乐观锁定
在JPA中定义了乐观锁定的规则,也就是用@Version。JPA中没有定义悲观锁定的要求,JPA的实现是可以自己实现的。
乐观锁定可能说所有的ORM都是"居家旅行,必备良药",所以我也不在这里罗嗦了,总之好处相当之多。
使用Entity Facade
这个我在关于对现有CMP进行的JPA升迁
中描述过,通过Facade模式减少了业务代码中对于JPA代码的依赖。
NamedQuery的命名规范
这是因为JPA的对于NamedQuery的界定造成的,在单一Persistence
Unit当中,NamedQuery是全局性的。如果两个Entity同时使用了相同的名字会产生冲突,而具体会用到哪个将由JPA实现来决定,这样就会
产生非所期待的结果。强烈建议所有的NamedQuery同一命名规范,我自己常用的是EntityName.NamedQuery,这样把重名的风险降
低到Entity一个级别,而且要求定义在Class里面,不允许动态创建NamedQuery。
我将在JPA Best Practices[2]中介绍在设计和代码中的一些Bast Practices。
分享到:
相关推荐
5. **Java Persistence API(JPA)与Hibernate**:JPA是Java EE规范,用于对象-关系映射(ORM),简化数据库访问。Hibernate是JPA的实现之一,提供了强大的查询语言(HQL)和缓存机制。 6. **Java Message Service...
Java EE 8 Design Patterns and Best Practices是一本详细探讨了Java企业级版本8(Java EE 8)在企业级应用开发中应用设计模式和最佳实践的书籍。本书旨在帮助开发者利用Java EE的最新特性来构建可扩展的企业级应用...
JPA) to relational data sources; but the JDBC API with its accompanying drivers are always the final piece connecting Java apps to their data! For more in depth (and entertaining) history, watch this ...
### 关于《Real World Java EE Patterns: Rethinking Best Practices》的重要知识点 #### 一、简介与背景 《Real World Java EE Patterns: Rethinking Best Practices》是一本深入探讨Java EE开发模式及其最佳实践...
功能完善,经过测试的功能完备的Spring 3.2参考应用程序,具有JPA持久性,REST Level-3资源,异步处理,作业,安全性,单元,模拟,集成,功能,其余客户端存根,性能测试以及许多最佳实践,聚集了在MVC / Spring / ...
本篇文章将围绕"Java-EE-8-Design-Patterns-and-Best-Practices-源码.rar"中的内容,深入探讨Java EE 8中的一些关键设计模式和最佳实践。 1. **设计模式**: - **工厂模式**:用于创建对象的类,提供了一种封装...
Spring-Jpa最佳做法스프링으로개발을하면서가했습니정정했습니다。 最佳实践,最佳实践,最佳实践。 지,프로젝트를이예라정이라깃허브开始,观看있습니다있습니다。 。이여러분에게이라도이라도이되기를기원합니다...
"java_ee_patterns_and_best_practices"这个主题涉及到Java EE开发中的模式和最佳实践,这些都是提升应用程序效率、可维护性和可扩展性的重要元素。 1. **分层架构**:Java EE应用通常采用分层架构,包括表现层...
Pro Spring Boot 2: An Authoritative Guide to Building Microservices, Web and Enterprise Applications, and Best Practices Quickly and productively develop complex Spring applications and microservices...
春天休息aop测试异步数据jpa飞行 -使用“ mvn clean package”运行带有HSQL DB的测试。 -使用“ spring-boot:run”在带有MYSQL DB的开发环境中运行项目。 别忘了创建一个名称为db_和username:并通过:的数据库。 ...
3. **Best Practices**:这份文档可能包含了在使用JPaaS框架时的最佳实践,涵盖了编码规范、设计原则、测试策略等方面,旨在提升项目的质量和可维护性。 4. **JPaaS Reference Implementation**:参考实现是框架的...
如果您需要深入了解该存储库中提供的性能配方,那么我相信您会喜欢我的书“ Spring Boot Persistence Best Practices” 如果您需要100多个Java持久性性能问题的提示和插图,那么“ Java持久性性能图解指南”非常...
Spring addresses and offers simple solutions for most aspects of your Java/Java EE application development, and guides you to use industry best practices to design and implement your applications. ...
《Real World Java EE Patterns Rethinking Best Practices》可能详细介绍了如工厂模式、单例模式、观察者模式等在Java EE环境中如何应用。例如,策略模式在处理业务规则变化时非常有用,而装饰器模式则允许在运行时...
13. **Best Practices**:提供J2EE开发的最佳实践,包括设计模式、性能优化和调试技巧。 通过这个"J2EE快速进阶培训PPT",学习者可以系统地了解J2EE的关键技术,逐步掌握开发企业级应用所需的技能。同时,PPT的形式...