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

Kde*_*per 13 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; 
} 
Run Code Online (Sandbox Code Playgroud)

但是在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
); 
Run Code Online (Sandbox Code Playgroud)

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

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

Pas*_*ent 7

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

如果JPA默认约定与公司的首选约定不匹配(没有"一个真实"标准),则覆盖它们.这可以使用@Table@Column注释完成(在Hibernate的特定情况下,您也可以提供自己的 实现NamingStrategy).

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

没有冲突,有Java命名约定,JPA端有一个默认约定用于将对象映射到表(因为JPA必须选择一个)并且SQL端没有"一个真正的"标准.所以:

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