@Column columnDefinition使哪些属性多余?
我经常这样指定我的@Column注释:
@Column(columnDefinition="character varying (100) not null",length=100,nullable=false)如您所见length,nullable即使columnDefinition已经指定了,我也指定了。那是因为我不知道这些值的确切位置/时间。
因此,在指定时columnDefinition,的其他哪些属性@Column将变得多余?
如果有关系,我可以使用Hibernate和PostgreSQL
回答:
- length
- precision
- scale
- nullable
- unique
也就是说,列DDL将包含:name+ columndefinition和其他所有内容 。
基本原理如下。
- 包含单词“ Column”或“ Table”的注释纯粹是物理的-属性 仅 用于根据数据库控制DDL / DML。 
- 其他纯逻辑注释-在Java内存中用于控制JPA处理的属性。 
- 这就是为什么有时会出现两次将可选性/可空性设置的原因-一次通过 - @Basic(...,optional=true)和一次通过- @Column(...,nullable=true)。前者说,在刷新时,JPA对象模型(内存中)的属性/关联可以为空;后者表示DB列可以为null。通常,您希望它们设置相同- 但并非总是如此 ,这取决于数据库表的设置和重用方式。
在您的示例中,length和nullable属性被覆盖和冗余。
- 在JPA Spec和javadoc中: - columnDefinition定义:
- columnDefinition默认值:
- 提供以下示例: - @Column(name="DESC", columnDefinition="CLOB NOT NULL", table="EMP_DETAIL")- @Column(name=”EMP_PIC”, columnDefinition=”BLOB NOT NULL”) 
- 而且,嗯…就是这样。:-$?! 
 
Javadoc和JPA规范未明确解决此问题-规范没有提供很好的保护。要100%确定,请使用您选择的实现进行测试。
- 从JPA规范中提供的示例可以安全地暗示以下内容 - 从“情境逻辑”中可以很安全地隐含以下内容(我只是说那句话?? :-P): 
- 剩下的只是“ unique”属性。它类似于nullable-扩展/限定类型定义,因此应将其视为类型定义的组成部分。即应该被覆盖。
 
对列“ A”和“ B”:
  @Column(name="...", table="...", insertable=true, updateable=false,          columndefinition="NUMBER(5,2) NOT NULL UNIQUE"
  @Column(name="...", table="...", insertable=false, updateable=true,
          columndefinition="NVARCHAR2(100) NULL"
- 确认生成的表具有正确的类型/可空性/唯一性
- (可选)执行JPA插入和更新:前者应包含A列,后一列B
以上是 @Column columnDefinition使哪些属性多余? 的全部内容, 来源链接: utcz.com/qa/432989.html






