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

时间:2010-10-15 18:33:52

标签: java sql hibernate jpa naming-conventions

在Java中,类(实体)的属性命名约定以CamelCase方式完成:

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

但是在SQL世界中,它被认为是best practice使用大写字母之间的下划线(如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映射。

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

4 个答案:

答案 0 :(得分:7)

  

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

如果JPA默认约定与贵公司的首选约定不匹配(没有“一个真正的”标准),请覆盖它们。这可以使用@Table@Column注释来完成(在Hibernate的特定情况下,您也可以提供自己的implementation of a NamingStrategy)。

  

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

  2. 人工主键名为ID_<<“”表名“>>。

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

  4. 您永远不会指望日期,时间或日期/时间字段是唯一的。永远。别忘了这个。我的意思是。

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

  6. 我相信还有更多,但这是一个开始。所有恕我直言。 YMMV。

    分享并享受。

答案 3 :(得分:2)

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

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

你也可以扩展ImprovedNamingStrategy来预先添加表名,或者如果你真的想要全部大写,但这似乎没必要。