问题 最佳实践:JPA的最佳数据库命名约定?


在Java中,类(实体)的属性的命名约定完成了 骆驼香烟盒 办法:

@Entity 
public class UserMessage implements Serializable { 
    @Id 
    private Integer id; 
    private String shortTitle;
    private String longTitle;
    private String htmlMessage; 
} 

但在SQL世界中,它被认为是一个 最佳实践 在单词之间使用带有下划线的大写(如Java常量)。在SQL世界中,最好的做法是将表名包含在列名中,这样外键在大多数情况下的命名与原始表中的id完全相同。

CREATE TABLE USER_MESSAGE (
    USER_MESSAGE_ID  MEDIUMINT(8) NOT NULL,
    USER_MESSAGE_SHORT_TITLE VARCHAR(20),
    USER_MESSAGE_LONG_TITLE VARCHAR(80),
    USER_MESSAGE_HTML_MESSAGE TEXT NOT NULL
); 

我应该遵循这两个标准并在@Table和@Column上使用name属性吗?或者我应该遵循Java约定并依赖于默认的JPA映射。

这种标准冲突最常见的方法和/或最佳方法是什么?


11697
2017-10-15 18:33


起源

“我应该遵循这两个标准,并在@Table和@Column上使用name属性”。这是你的答案。让注释完成它们的工作。 - Sean
我不确定我是否真的同意这个非常生气的命名约定被认为是“SQL世界”中的“最佳实践”。只是在说 ... - BobbyShaftoe


答案:


我应该遵循这两个标准并在@Table和@Column上使用name属性吗?或者我应该遵循Java约定并依赖于默认的JPA映射。

如果JPA默认约定与 首选 贵公司的惯例(没有“一个真实的”标准),覆盖它们。这可以使用 @Table 和 @Column 注释(在Hibernate的特定情况下,您也可以提供自己的注释) 执行一个 NamingStrategy)。

这种标准冲突最常见的方法和/或最佳方法是什么?

没有冲突,有Java命名约定,有  JPA一侧的默认约定,用于将对象映射到表(因为JPA必须选择一个)和 SQL方面没有“一个真正的”标准。所以:

  • 如果您的公司没有任何SQL命名约定,则可以使用JPA约定
    • 如果你不喜欢它们,请覆盖它们
  • 如果您的公司有适当的惯例,请遵循它们并覆盖JPA默认值

6
2017-10-16 12:21



谢谢Pascal。另一个:如何处理数据库中不存在包命名空间导致的命名冲突?例如:您有一个实体app.model.forum.Post和app.model.blog.Post。您是否会将这些类重命名为像ForumPost和BlogPost这样的唯一名称,以便它们可以引用相同的表名?如何最好地解决此命名空间冲突? - Kdeveloper
@Kdeveloper如果您决定依赖JPA默认值,那么您必须确实使用不同的实体名称,就像在您的示例中一样(这也会使查询更容易)。 - Pascal Thivent


跟着两个。对于DBA而言,db惯例应该存在,并且思维集不同的是手动报告和查询。在注释上使用名称params来实现此目的。


2
2017-10-15 18:56





我想这取决于你指的是哪些惯例。我没有将表名放入列名中 - 为了重复你已经知道的内容,丢失一半命名空间的重点是什么? (我尝试)遵循的一些规则是:

  1. 长而有意义的名字比短名称更好,例如TRANSACTION_DATE而不是TRAN_DT。是的,当你被限制在6个字符的变量名称时,我已经足够大了写Fortran,我记得Basic变种你只有AZ,A0-Z0 ...... A9-Z9 - 但我也够老了学得更好。索引等的单字符变量名称很好 - 实际上是传统的 - 但是当我找到一个带有12个单字母变量名称的函数时,每个函数用于多个目的我...我并不觉得有趣。

  2. 人工主键被命名为ID _ <<“表名”>>。

  3. 单场自然数据主键是最好的。两场自然主键都可以。三个或更多字段 - 创建一个人工主键并使自然键成为备用唯一键。

  4. 你永远不会指望日期,时间或日期/时间字段是独一无二的。永远。别忘了这个。我是认真的。

  5. 混淆编码技术相当于无能。

我相信还有更多,但这是一个开始。所有恕我直言。因人而异。

分享和享受。


2
2017-10-15 21:16





就我而言,要么是可以接受的。但是如果您决定不需要默认的驼峰式情况,那么您可以获得不同的命名策略,而无需诉诸于为每个注释添加name属性的繁琐且容易出错的任务。

看一下Hibernate的org.hibernate.cfg.ImprovedNamingStrategy类。它使用下划线而不是驼峰的情况。只需在Hibernate配置上设置属性即可使用它。

您还可以扩展ImprovedNamingStrategy以预先添加表名,或者如果您真的想要全部大写,但这似乎是不必要的。


2
2017-10-15 21:28