我的答案:所有以下内容都应该被覆盖(如果适用的话,在列定义中描述它们):
>长度
>精度
>规模
>可空
>独特
即列DDL将由以下内容组成:name columndefinition,而没有别的。
理由如下。
>包含单词“Column”或“Table”的注释是纯物理属性,仅用于根据数据库控制DDL / DML。
>其他注释纯逻辑 – 在java中使用内存中的属性来控制JPA处理。
这就是为什么有时候看来,可选性/可空性设置两次 – 一次通过@Basic(…,可选= true),一次通过@Column(…,nullable = true)。前面说的属性/关联可以在JPA对象模型(内存中)为空,在冲洗时间;后者表示DB列可以为空。通常你会希望他们设置相同 – 但不总是,这取决于DB表的设置和重用。
在您的示例中,长度和可空属性被覆盖和冗余。
So, when specifying columnDefinition, what other properties of @Column are made redundant?
>在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规范没有明确地解决这个规范没有给予很大的保护。要百分之百地确定,测试您选择的实施。
> JPA规范中提供的示例可以安全地隐含以下内容
>名称&表可以与columnDefinition一起使用,也不能被覆盖
> nullable被columnDefinition覆盖/冗余
>以下可以从“情境的逻辑”中相当安全地隐含(我只是说:? – P):
> length,precision,scale由columnDefinition重写或冗余,它们是类型的一部分
可插入和可更新是单独提供的,并且从未包含在columnDefinition中,因为它们在将数据发送到数据库之前控制内存中的SQL生成。
>只留下“独一无二”的财产。它类似于可空的 – 扩展/限定类型定义,因此应该对类型定义进行整体处理。即应该被覆盖。
测试我的答案
列“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