Hades,您的下一个坚持天使?

一年前,我的一位同事向我展示了一个非常有趣的框架,名为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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值