对于简单的字符串字段,
@Entity
class Foo {
//1. @Basic(optional = false)
//2. @Column(length = 100, nullable = false)
String name;
}
我需要使用@Column
注释来限制名称的长度,但我对可以为空的属性感到困惑。当我使用@ManyToOne
和@OneToMany
之类的其他注释时,我会使用optional
来保持大多数注释的统一。但我不能用@Basic(optional)
限制名称的长度。
那么,我应该在哪里注释可空属性,@Basic
或@Basic
?
修改的
简单地说,您希望采用哪种形式:
表格1:
@Column
表格2:
@Entity
class Foo {
@Basic(optional = false)
@Column(length = 100)
String name;
}
我个人喜欢表单1,因为@Entity
class Foo {
@Column(length = 100, nullable = false)
String name;
}
注释会使用optional
属性,但表单2也很好,因为它是在单个注释中完成的。
修改
阅读http://markmail.org/message/osod6rsauwbnkvya后,我得到了@ManyToOne
和@Basic.optional
之间的区别。但我仍然不知道应该使用哪一个。包含两个注释似乎很好,因此要很好地定义基础表,并在实际更新之前检查JPA中的null可能稍快一些。
答案 0 :(得分:10)
来自API文档:
@Basic注释是最简单的类型 映射到数据库列。该 基本注释可以应用于a 持久属性或实例 以下任何一项的变量 types:Java原始类型,包装器 原始类型,String, java.math.BigInteger中, java.math.BigDecimal,java.util.Date, java.util.Calendar,java.sql.Date, java.sql.Time,java.sql.Timestamp, byte [],Byte [],char [],Character [], 枚举,以及任何其他类型 实现Serializable。
@Column用于指定映射 持久属性的列或 领域。如果没有Column注释 指定,默认值为 应用
因此,如果您未指定@Column
,则它会从getter / setter派生列值。
如果您需要指定列名,则必须@Column
注释。
@Basic
允许您指定抓取类型。如果要更改默认提取类型,则必须使用此批注,否则可以省略它。