一年前,我的一位同事向我展示了一个非常有趣的框架,名为Krank (后来更名为Crank,因为先前的名称在德语中表示“病态”,对任何框架而言都不是好兆头)。 Crank的目标是简化Java Persistence API 1.0之上的开发。 当时有两个有趣的功能引起了我的注意:
- 通用的DAO,可即时实现CRUD操作。 这是一个圣杯,只需尝试向Google获取“ Generic DAO”并观看结果:每个人似乎都提供了此类。 是否每个人都成功,我留给读者。
- 此通用DAO和命名查询之间的绑定机制,使您免于必须自己创建查询对象的负担
不幸的是,自2008年以来Crank没有任何活动,我认为可以将其归类为绝对死亡。 但是,我不知道是否存在链接,一个新项目已经出现,它不仅实现了相同的功能,而且还增加了更多创新的功能。 我最近才发现的这个项目是Hades项目 ,该项目的目的是提高持久层的生产力,特别是对于JPA v2。 现在,它绝对位于我的“热门话题”列表的顶部。
为了评估Hades,我实现了一些非常简单的单元测试:它照原样工作! 让我们概述一下Hades功能。
配置阴影
无论您是否喜欢,Hades的配置都基于Spring。 就我个人而言,我这样做是因为它使配置Hades变得轻而易举。 Hades为此使用了Spring的一个鲜为人知的功能,即创作(有关该主题的更多信息,请参见我以前的Spring创作文章)。 考虑一下我们已经有一个Spring bean配置文件,并且已经定义了实体管理器工厂。 只需将Hades命名空间添加到标题中,并引用DAO类的基本包:
<beans...
xmlns:hades="http://schemas.synyx.org/hades"
xsi:schemaLocation="...
http://schemas.synix.org/hades http://schemas.synyx.org/hades/hades.xsd ...">
<hades:dao-configbase-package="ch.frankel.blog.hades.dao"/>
</beans>
由于Hades在配置上使用约定,因此它将:
- 在配置的包中为每个DAO接口(必须继承自
GenericDAO
)透明地创建一个Spring bean - 在第一个字母设置为小写的非限定类名称下引用它
- 向其注入默认的实体管理器工厂和事务管理器,前提是它们分别声明为“ entityManagerFactory”和“ transactionManager”
通用DAO
Hades通用DAO支持单个实体和整个表上的标准CRUD操作以及COUNT。 在幕后,它将使用注入的实体管理器工厂获得对实体管理器的引用,并将后者用于这些操作。
命名查询
使用JPA的命名查询需要最少的样板代码(但仍然需要),并且不提供泛型签名(此后需要转换):
Queryquery=em.createNamedQuery("findUsersByName").setParameter(name);
Listresult=query.getResultList();
另一方面,Hades在命名查询和接口的方法名称之间提供了一种绑定机制:
publicinterfaceUserDaoextendsGenericDao{
List<User>findUsersByName(Stringname);
}
现在,您只需要将DAO注入您的服务并按原样使用即可。
从方法名称查询简单条件
您手动编写的大多数命名查询的形式为SELECT * FROM MYTABLE WHERE A = 'a' and B = 'b'
或其他简单条件。 Hades可以自动生成和执行与您的方法名称相关的查询。 例如,如果您的DAO的方法签名是List findByLastNameOrAgeLessThan(String name, Date age)
,则Hades将创建关联的查询SELECT * FROM User u where u.lastName = ?1 and u.age < ?2
并绑定传递的参数。
尽管我对基于方法名称的此类功能有所警惕,但我意识到它可以确保方法的语义与方法的功能保持一致。 而且,没有任何代码可编写! 确实,我可以很容易地爱上这个功能...
增强您的DAO
曲柄的通用DAO有一个主要缺点。 如果要添加方法,则必须创建一个具体的DAO类,用通用类组成DAO,然后将所有标准CRUD操作委托给通用。 然后,您可以在具体的DAO上编写额外的方法。 至少这是我必须要做的设计,这并不是很复杂,因为可以使用您最喜欢的IDE编码委托,但是这很无聊,并且您最终得到了一个非常长的类,充满了委派电话。 不是我所说的简单代码。
Hades从一开始就设计了这种行为。 当您需要将方法添加到特定的DAO时,您要做的就是:
- 用额外的方法创建一个接口
- 创建一个实现此接口的具体类,并对这些方法进行编码。 由于您使用Spring,因此只需将其作为Spring Bean引用即可注入实体管理器工厂
- 重用简单的DAO接口,并使其扩展您的特定接口以及
GenericDao
(如之前)
完成:像馅饼一样简单,设计精美。 你还能要求什么呢?
结论
Hades似乎相对较新(2009年4月的第一张票),但看起来很有希望。 在那之前,我可能看到的唯一“缺陷”是事务管理:默认情况下,CRUD操作是事务性的,尽管恕我直言,事务性应在服务层中进行处理。 但是,就其带来的所有好处而言,它相对较小。 此外,可以避免使用这种新项目的麻烦,因为它将在不久的将来加入 Spring Data ,我认为这是Hades简单性和功能的很好标志。
对于我来说,我没有用过,只是随便看了一下Hades。 有人在“真实”项目中使用过它吗? 在哪种情况下? 有哪些结果? 如果您有任何反馈,我将非常感兴趣。
与往常一样,您可以在此处找到本文的资源。
翻译自: https://blog.frankel.ch/hades-your-next-persistence-angel/