最佳实践:JPA 的最佳数据库命名约定?[已关闭]

2022-09-04 03:09:06

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

@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映射。

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


答案 1

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

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

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

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

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

答案 2

我想这取决于你所指的是谁的约定。我不会将表名放入列名中 - 仅仅为了重复您已经知道的内容而丢失一半的命名空间有什么意义?(一些)我(试图)遵循的规则是:

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

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

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

  4. 你永远不要指望一个日期、时间或日期/时间字段是唯一的。曾。不要忘记这一点。我说真的。

  5. 混淆编码技术等同于无能。

我相信还有更多,但这是一个开始。恕我直言。新浪网.

分享和享受。