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