我经常指定我的@Column
注释:
@Column(columnDefinition="character varying (100) not null",length=100,nullable=false)
正如您所看到的,我指定了length
和nullable
,即使columnDefinition
已经指定了这些内容。那是因为我不知道这些值的确切使用位置/时间。
那么,在指定columnDefinition
时,@Column
的哪些其他属性会变得多余?
如果重要,我使用Hibernate和PostgreSQL
答案 0 :(得分:65)
我的答案:以下所有内容都应该被覆盖(例如,如果合适,请在columndefinition
内描述所有内容):
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属性被覆盖且冗余。
那么,在指定columnDefinition时,@ Column的其他哪些属性是多余的?
在JPA Spec&的Javadoc:
columnDefinition
定义:
为列生成DDL时使用的SQL片段。
columnDefinition
默认:
生成SQL以创建推断类型的列。
提供以下示例:
@Column(name="DESC", columnDefinition="CLOB NOT NULL", table="EMP_DETAIL")
@Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
而且,错误......,就是这样。 : - $?!
columnDefinition是否会覆盖同一注释中提供的其他属性?
javadoc和JPA规范没有明确说明这一点 - 规范没有给予很好的保护。为了100%确定,请使用您选择的实施进行测试。
JPA规范
中提供的示例可以安全地暗示以下内容name
& table
可以与columnDefinition
结合使用,也不会被覆盖 nullable
被columnDefinition
从“情境的逻辑”中可以相当安全地暗示以下内容(我只是说?? :-P):
length
,precision
,scale
被columnDefinition
覆盖/变为多余 - 它们是类型的组成部分 insertable
和updateable
是单独提供的,并且从未包含在columnDefinition
中,因为它们在将数据库发送到数据库之前控制内存中的SQL生成。 只留下“unique
”属性。它类似于nullable - 扩展/限定类型定义,因此应该对类型定义进行整数处理。即应该被覆盖。
测试我的答案 对于“A”和“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"
答案 1 :(得分:5)
columnDefinition 将覆盖hibernate为此特定列生成的sql DDL,它不可移植,取决于您使用的数据库。您可以使用它来指定可空,长度,精度,比例......等等。