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

Java 最佳实践:JPA的最佳数据库命名约定?,java,sql,hibernate,jpa,naming-conventions,Java,Sql,Hibernate,Jpa,Naming Conventions,在Java中,类(实体)属性的命名约定是通过以下方式完成的: 但是在SQL世界中,在单词之间使用带下划线的大写字母(如Java常量)被认为是一种错误。在SQL世界中,将表名包含在列名中也是一种最佳实践,这样在大多数情况下,外键的命名与原始表中的id完全相同 CREATE TABLE USER_MESSAGE ( USER_MESSAGE_ID MEDIUMINT(8) NOT NULL, USER_MESSAGE_SHORT_TITLE VARCHAR(20), USE

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

但是在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映射


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

遵循这两种方法。db约定应该存在于DBA以及思维定势不同的手动报告和查询中。使用注释上的名称参数来实现这一点。

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

  • 长而有意义的名称比短名称好,例如事务日期而不是事务日期。是的,我已经足够大了,当你被限制为6个字符的变量名时,我已经写过Fortran了,我还记得一些基本的变体,其中你只有A-Z,A0-Z0…A9-Z9,但我也足够大了,可以学得更好。索引等的单字符变量名很好——事实上是传统的——但当我发现一个函数有12个单字母变量名,每个变量名用于多种用途时,我……一点也不觉得好笑

  • 人工主键被命名为ID_

  • 单字段自然数据主键最好。两个字段自然主键正常。三个或更多字段-创建一个人工主键,并将自然键设置为备用唯一键

  • 你永远不能指望某个日期、时间或日期/时间字段是唯一的。曾经别忘了这一点。我是认真的

  • 模糊编码技术相当于无能

  • 我肯定还有很多,但这只是个开始。好的。YMMV


    分享和享受。

    就我而言,两者都是可以接受的。但是,如果您决定不使用默认的驼峰大小写,则可以使用不同的命名策略,而不必求助于为每个注释添加name属性这一繁琐且容易出错的任务

    看看Hibernate的org.Hibernate.cfg.ImprovedNamingStrategy类。它使用下划线而不是驼峰大小写。只需在Hibernate配置上设置一个属性来使用它

    您还可以扩展ImprovedNamingStrategy,在表名前面加上前缀,或者如果您真的愿意,也可以全部使用大写,但这似乎是不必要的


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

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

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

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

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

    “我是否应该遵循这两个标准并在@Table和@Column上使用name属性?”。这是你的答案。让注释来完成它们的工作。我不确定我是否真的同意那种看起来非常愤怒的命名约定被认为是“SQL世界”中的“最佳实践”。只是说…谢谢Pascal。另一个问题:如何处理由于数据库中不存在包名称空间而导致的命名冲突?例如:您有一个实体app.model.forum.Post和app.model.blog.Post。您是否将这些类重命名为唯一的名称,如ForumPost和BlogPost,以便它们可以引用相同的表名?如何最好地解决这个名称空间冲突?@Kdeveloper如果您决定依赖JPA默认值,那么您就必须使用不同的实体名称,就像您的示例中那样(这也会使查询更容易)。
    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
    );