【发布时间】:2012-06-07 15:29:48
【问题描述】:
在 JPA 中创建命名查询时,这些查询的名称是否存在公认的最佳实践(例如 EntityName.allActive 或 findAllActiveFoos 等),并且在实体类中声明这些命名查询是否很好他们在一个实用程序类中查询还是一起查询?
【问题讨论】:
标签: java jpa naming-conventions
在 JPA 中创建命名查询时,这些查询的名称是否存在公认的最佳实践(例如 EntityName.allActive 或 findAllActiveFoos 等),并且在实体类中声明这些命名查询是否很好他们在一个实用程序类中查询还是一起查询?
【问题讨论】:
标签: java jpa naming-conventions
不,没有涵盖任何复杂案例的广泛接受的最佳实践。此外,一般来说,JPA 没有太多可用的样式指南。似乎被普遍接受并且通常也用于书籍的方法是从实体名称开始查询。
我会选择 EntityName(以保证持久性单元中的唯一名称)结合操作和参数。
请注意,规范在示例中使用with 而不是by,并且不使用实体名称作为查询前缀。但这当然是规范,而不是风格指南。
我发现为这些查询名称声明常量然后在 @NamedQuery.name 和 em.createNamedQuery 中使用这些常量是很好的。
由于@NamedQuery、@NamedNativeQuery 和@NamedQueries 只能应用于映射的超类或实体,因此您无法将它们定位到实用程序类。
【讨论】:
Entity.camelCaseWhatItDoesName 几乎可以作为最佳实践。在过去的项目中,有几个客户采用了这种风格。
尽管似乎没有全球公认的最佳实践,但 Mike Keith 和 Merrick Shincariol 所著的“Pro JPA 2”一书准确地推荐了 Mikko 所说的内容,例如如果您有查找所有员工的查询,则将其命名为“Employee.findAll”。
Ito 在哪里声明这些,从我所见,再次没有真正的最佳实践。他们似乎倾向于在实体本身上声明它们,而不是在一个大类中声明它们(例如所有实体都从中扩展的基础 MappedSuperclass),因为这很快就会变得单一并且可能有点难以维护。另一种选择是在单独的 XML 文件中声明它们,我不建议这样做。我个人喜欢在与它们相关的实体上声明它们的方法。我也同意 Miko 建议使用常量作为名称,您可以将所有这些常量定义在一个单独的类中。
【讨论】: