最佳实践:JPA 最佳数据库命名约定是什么?

15

在Java中,属性和类(实体)的命名惯例是使用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жҳ е°„гҖӮ

еңЁиҝҷз§Қж ҮеҮҶеҶІзӘҒзҡ„жғ…еҶөдёӢпјҢжңҖеёёи§Ғе’Ң/жҲ–жңҖдҪізҡ„ж–№жі•жҳҜд»Җд№Ҳпјҹ


“我应该遵循两个标准并在@Table和@Column上使用name属性吗?” 这是你的答案。让注释完成它们的工作即可。 - Sean
2
我不确定那种看起来非常愤怒的命名约定在“SQL世界”被认为是“最佳实践”。只是这么说... - BobbyShaftoe
4个回答

8

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

如果JPA的默认约定不符合公司的首选约定(不存在“唯一真实”的标准),请覆盖它们。这可以使用@Table和@Column注释来完成(在Hibernate的特定情况下,您还可以提供自己的实现NamingStrategy)。

在这种标准冲突中,最常见和/或最好的方法是什么?

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

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

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

3
我想这取决于你所指的约定是谁制定的。我不会将表名放入列名中,重复已知信息只会浪费一半的命名空间,这有什么意义呢?以下是我遵循的(部分)规则:
  1. 长而有意义的名称比短名称更好,例如TRANSACTION_DATE而不是TRAN_DT。是的,我够老了,曾经写过Fortran,当时变量名只能使用6个字符,我还记得只有A-Z、A0-Z0...A9-Z9的Basic变体——但我也足够老了,学会了更好的方式。对于索引等单字符变量名是可以接受的,甚至是传统的,但当我发现一个函数有十二个单字母变量名,每个变量都用于多种用途时,我就会感到不满。

  2. 人工主键的名称为ID_<<"表名">>。

  3. 最好使用单字段自然数据主键。两个字段的自然主键也可以。三个或更多字段则需要创建人工主键,并将自然键作为备用唯一键。

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

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

我确信还有更多,但这是一个开始。以上纯属个人意见,结果可能因人而异。

分享并享受。


2

同时遵循这两种方式。数据库的规范应该出于DBA的考虑以及手动报告和查询,这些情况下思维方式不同。使用注释中的名称参数来实现此目的。


2
据我所知,两种命名方式均可接受。但如果您决定不使用默认的驼峰命名法,则可以通过设置不同的命名策略来避免繁琐且容易出错的任务,而无需在每个注释中添加名称属性。
请查看 Hibernate 的 org.hibernate.cfg.ImprovedNamingStrategy 类。它使用下划线代替驼峰命名法。只需在 Hibernate 配置中设置一个属性即可使用它。
您还可以扩展 ImprovedNamingStrategy 来在表名前添加前缀或全部使用大写字母,但这似乎是不必要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接