在Java中,类(实体)的属性的命名约定完成了 骆驼香烟盒 办法:
@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属性吗?或者我应该遵循Java约定并依赖于默认的JPA映射。
如果JPA默认约定与 首选 贵公司的惯例(没有“一个真实的”标准),覆盖它们。这可以使用 @Table
和 @Column
注释(在Hibernate的特定情况下,您也可以提供自己的注释) 执行一个 NamingStrategy
)。
这种标准冲突最常见的方法和/或最佳方法是什么?
没有冲突,有Java命名约定,有 一 JPA一侧的默认约定,用于将对象映射到表(因为JPA必须选择一个)和 SQL方面没有“一个真正的”标准。所以:
- 如果您的公司没有任何SQL命名约定,则可以使用JPA约定
- 如果您的公司有适当的惯例,请遵循它们并覆盖JPA默认值
跟着两个。对于DBA而言,db惯例应该存在,并且思维集不同的是手动报告和查询。在注释上使用名称params来实现此目的。
我想这取决于你指的是哪些惯例。我没有将表名放入列名中 - 为了重复你已经知道的内容,丢失一半命名空间的重点是什么? (我尝试)遵循的一些规则是:
长而有意义的名字比短名称更好,例如TRANSACTION_DATE而不是TRAN_DT。是的,当你被限制在6个字符的变量名称时,我已经足够大了写Fortran,我记得Basic变种你只有AZ,A0-Z0 ...... A9-Z9 - 但我也够老了学得更好。索引等的单字符变量名称很好 - 实际上是传统的 - 但是当我找到一个带有12个单字母变量名称的函数时,每个函数用于多个目的我...我并不觉得有趣。
人工主键被命名为ID _ <<“表名”>>。
单场自然数据主键是最好的。两场自然主键都可以。三个或更多字段 - 创建一个人工主键并使自然键成为备用唯一键。
你永远不会指望日期,时间或日期/时间字段是独一无二的。永远。别忘了这个。我是认真的。
混淆编码技术相当于无能。
我相信还有更多,但这是一个开始。所有恕我直言。因人而异。
分享和享受。
就我而言,要么是可以接受的。但是如果您决定不需要默认的驼峰式情况,那么您可以获得不同的命名策略,而无需诉诸于为每个注释添加name属性的繁琐且容易出错的任务。
看一下Hibernate的org.hibernate.cfg.ImprovedNamingStrategy类。它使用下划线而不是驼峰的情况。只需在Hibernate配置上设置属性即可使用它。
您还可以扩展ImprovedNamingStrategy以预先添加表名,或者如果您真的想要全部大写,但这似乎是不必要的。