Bar*_*lom 46 java hibernate jpa
我经常指定这样的@Column注释:
@Column(columnDefinition="character varying (100) not null",length=100,nullable=false)
Run Code Online (Sandbox Code Playgroud)
如您所见,我指定length,nullable即使columnDefinition已经指定了那些.那是因为我不知道这些值的确切使用位置/时间.
那么,在指定时columnDefinition,哪些其他属性@Column是多余的?
如果重要,我使用Hibernate和PostgreSQL
Gle*_*est 67
我的答案:以下所有内容都应该被覆盖(即在columndefinition适当的时候将其全部描述):
lengthprecisionscalenullableunique即列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中:
columnDefinitiondefinition:
为列生成DDL时使用的SQL片段.
columnDefinitiondefault:
生成的SQL以创建推断类型的列.
提供以下示例:
@Column(name="DESC", columnDefinition="CLOB NOT NULL", table="EMP_DETAIL")
@Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
Run Code Online (Sandbox Code Playgroud)而且,错误......,就是这样.: - $?!
columnDefinition是否覆盖同一注释中提供的其他属性?
javadoc和JPA规范没有明确地解决这个问题 - 规范没有提供很好的保护.要100%确定,请使用您选择的实施进行测试.
JPA规范中提供的示例可以安全地暗示以下内容
name&table可以与之结合使用columnDefinition,也不会被覆盖nullable 被覆盖/被多余 columnDefinition从"情境逻辑"中可以相当安全地暗示以下内容(我只是说?? :-P):
length,precision,scale被覆盖/冗余由columnDefinition-它们是一体的类型insertable并且updateable是单独提供的,并且从不包含在内columnDefinition,因为它们在将数据库发送到数据库之前控制内存中的SQL生成.这只剩下" 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"
Run Code Online (Sandbox Code Playgroud)
columnDefinition将覆盖hibernate为此特定列生成的sql DDL,它不可移植,取决于您使用的数据库.您可以使用它来指定可空,长度,精度,比例等.