`
pavel
  • 浏览: 919023 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

em.getReference的使用

    博客分类:
  • jpa
阅读更多

JPA Best Practices


分离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。

分享到:
评论

相关推荐

    ABB传动调试软件DriveWindow介绍PPT学习教案.pptx

    1. 控制操作(启动、停止、getReference 等) 2. 监控信号的数字和图形显示 3. 参数设置(更改值) 4. 数据记录器(控制、显示) 5. 故障记录器(显示故障、控制) 6. 备份和恢复(完整软件备份) 7. 网络上的所有...

    GetReference-crx插件

    语言:English 复制参考文献和标题 您可以轻松获取网页参考。

    phpstan-doctrine, PHPStan的Doctrine 扩展.zip

    phpstan-doctrine, PHPStan的Doctrine 扩展 PHPStan的Doctrine 扩展 PHPStanDoctrine这里扩展提供以下功能:提供 DoctrineORMEntityManager::find 。getReference 和 getPartial

    数据库管理工具:dbeaver-ce-23.1.5-macos-aarch64.dmg

    1.DBeaver是一款通用数据库工具,专为开发人员和数据库管理员设计。 2.DBeaver支持多种数据库系统,包括但不限于MySQL、PostgreSQL、Oracle、DB2、MSSQL、Sybase、Mimer、HSQLDB、Derby、SQLite等,几乎涵盖了市场上所有的主流数据库。 3.支持的操作系统:包括Windows(2000/XP/2003/Vista/7/10/11)、Linux、Mac OS、Solaris、AIX、HPUX等。 4.主要特性: 数据库管理:支持数据库元数据浏览、元数据编辑(包括表、列、键、索引等)、SQL语句和脚本的执行、数据导入导出等。 用户界面:提供图形界面来查看数据库结构、执行SQL查询和脚本、浏览和导出数据,以及处理BLOB/CLOB数据等。用户界面设计简洁明了,易于使用。 高级功能:除了基本的数据库管理功能外,DBeaver还提供了一些高级功能,如数据库版本控制(可与Git、SVN等版本控制系统集成)、数据分析和可视化工具(如图表、统计信息和数据报告)、SQL代码自动补全等。

    一份关于信号与系统的大纲教程!!!!!!!!!!!!!

    一份关于信号与系统的大纲教程!!!!!!!!!!!!!

    【课件】7.5.1散列表的基本概念.pdf

    【课件】7.5.1散列表的基本概念

    【课件】8.7.4置换-选择排序.pdf

    【课件】8.7.4置换-选择排序

    Delphi 12 控件之unidac-10.2.1-d29pro.exe

    unidac_10.2.1_d29pro.exe

    基于STM32的微控制器的C++语言研究项目

    此代码是基于 C、C++ 语言的 stm32 为微控制器编写的。 代码包含单独的部分:main、ini、USART code_for_display。 ADC_ini(模数转换器)是关于初始化ADC的。每当您触发模拟输入以开始转换时,它都会对模拟输入进行采样。它执行一个称为量化的过程,以决定电压电平及其在输出寄存器中推送的二进制代码。 USART(通用异步接收器-发射器)是一种外围通信硬件设备,它允许计算机通过 wifi 或蓝牙与串行连接的设备进行同步和异步通信。 code_for_display部分是包含 7 段显示的代码。 main 初始化ADC_ini,USART,code_for_display并开始接收信息的循环,显示它,将其发送到另一个设备,重复

    数据库表结构同步工具.zip

    大学生数据结构学习笔记和资料大全!

    数据库管理工具:dbeaver-ce-23.2.1-x86-64-setup.exe

    1.DBeaver是一款通用数据库工具,专为开发人员和数据库管理员设计。 2.DBeaver支持多种数据库系统,包括但不限于MySQL、PostgreSQL、Oracle、DB2、MSSQL、Sybase、Mimer、HSQLDB、Derby、SQLite等,几乎涵盖了市场上所有的主流数据库。 3.支持的操作系统:包括Windows(2000/XP/2003/Vista/7/10/11)、Linux、Mac OS、Solaris、AIX、HPUX等。 4.主要特性: 数据库管理:支持数据库元数据浏览、元数据编辑(包括表、列、键、索引等)、SQL语句和脚本的执行、数据导入导出等。 用户界面:提供图形界面来查看数据库结构、执行SQL查询和脚本、浏览和导出数据,以及处理BLOB/CLOB数据等。用户界面设计简洁明了,易于使用。 高级功能:除了基本的数据库管理功能外,DBeaver还提供了一些高级功能,如数据库版本控制(可与Git、SVN等版本控制系统集成)、数据分析和可视化工具(如图表、统计信息和数据报告)、SQL代码自动补全等。

    Android-Retrofit-Images在这个示例 Android 项目中

    Android-Retrofit-Images在这个示例 Android 项目中

    数据库管理工具:dbeaver-ce-23.0.2-macos-aarch64.dmg

    1.DBeaver是一款通用数据库工具,专为开发人员和数据库管理员设计。 2.DBeaver支持多种数据库系统,包括但不限于MySQL、PostgreSQL、Oracle、DB2、MSSQL、Sybase、Mimer、HSQLDB、Derby、SQLite等,几乎涵盖了市场上所有的主流数据库。 3.支持的操作系统:包括Windows(2000/XP/2003/Vista/7/10/11)、Linux、Mac OS、Solaris、AIX、HPUX等。 4.主要特性: 数据库管理:支持数据库元数据浏览、元数据编辑(包括表、列、键、索引等)、SQL语句和脚本的执行、数据导入导出等。 用户界面:提供图形界面来查看数据库结构、执行SQL查询和脚本、浏览和导出数据,以及处理BLOB/CLOB数据等。用户界面设计简洁明了,易于使用。 高级功能:除了基本的数据库管理功能外,DBeaver还提供了一些高级功能,如数据库版本控制(可与Git、SVN等版本控制系统集成)、数据分析和可视化工具(如图表、统计信息和数据报告)、SQL代码自动补全等。

    基于MSP430F5529的两路寻迹小车.zip

    基于MSP430F5529的两路寻迹小车.zip

    cpp实现数据库和数据结构大作业:图书管理系统.zip

    大学生 C/C++/JAVA/Python数据结构学习笔记和资料大全

    Windows下开箱后即时编译体验freeRTOS 的MDK demo工程,使用事件Event实现freeRTOS多线程通信

    Windows下的MDK Keil uVision4的demo工程,STM32F103的IC,开箱即可编译烧写体验: 已包含完整的freeRTOS依赖,可直观体验freeRTOS事件Event实现的多线程通信,代码方面主要通过未使用事件Event来实现多个线程间通信。 工程方面已经集成了freeRTOS的源码及相关事件Event的使用示例,配合博文《FreeRTOS 体验教程:7.如何用事件Event实现FreeRTOS多线程通信?》食用效果更佳。

    一个简单的实验设计示例以及其预期结果

    头歌c语言实验答案 实验结果: 当输入示例字符串后,程序将输出预期结果: Character count: 49 Word count: 9 Line count: 3 这样的实验设计可以帮助学生加深对C语言字符串处理的理解,包括指针操作、字符分类函数的使用以及基本的逻辑控制。

    C#学生管理系统.zip 学生选课及成绩查询系统是一个学校不可缺少的部分.zip

    C#学生管理系统.zip 学生选课及成绩查询系统是一个学校不可缺少的部分

    Eclipse archetype-catalog.xml.zip

    Eclipse archetype-catalog.xml

    数据库管理工具:dbeaver-ce-23.0.1-linux.gtk.x86-64.tar.gz

    1.DBeaver是一款通用数据库工具,专为开发人员和数据库管理员设计。 2.DBeaver支持多种数据库系统,包括但不限于MySQL、PostgreSQL、Oracle、DB2、MSSQL、Sybase、Mimer、HSQLDB、Derby、SQLite等,几乎涵盖了市场上所有的主流数据库。 3.支持的操作系统:包括Windows(2000/XP/2003/Vista/7/10/11)、Linux、Mac OS、Solaris、AIX、HPUX等。 4.主要特性: 数据库管理:支持数据库元数据浏览、元数据编辑(包括表、列、键、索引等)、SQL语句和脚本的执行、数据导入导出等。 用户界面:提供图形界面来查看数据库结构、执行SQL查询和脚本、浏览和导出数据,以及处理BLOB/CLOB数据等。用户界面设计简洁明了,易于使用。 高级功能:除了基本的数据库管理功能外,DBeaver还提供了一些高级功能,如数据库版本控制(可与Git、SVN等版本控制系统集成)、数据分析和可视化工具(如图表、统计信息和数据报告)、SQL代码自动补全等。

Global site tag (gtag.js) - Google Analytics