JPA:我应该使用哪个?基本(可选)或列(可为空)?
Posted
技术标签:
【中文标题】JPA:我应该使用哪个?基本(可选)或列(可为空)?【英文标题】:JPA: Which should I use? Basic(optional) or Column(nullable)? 【发布时间】:2011-04-09 04:38:02 【问题描述】:对于简单的字符串字段,
@Entity
class Foo
//1. @Basic(optional = false)
//2. @Column(length = 100, nullable = false)
String name;
我需要使用@Column
注释来限制名称的长度,但我对可空属性感到困惑。虽然我正在使用其他注释,例如 @ManyToOne
和 @OneToMany
,它们使用 optional
属性,但我想使用 @Basic(optional)
来保持大多数注释的统一。但我不能用@Basic
限制名称的长度。
那么,我应该在哪里注释可空属性,@Basic
或 @Column
?
编辑
简单地说,您更喜欢哪种形式:
表格一:
@Entity
class Foo
@Basic(optional = false)
@Column(length = 100)
String name;
表格2:
@Entity
class Foo
@Column(length = 100, nullable = false)
String name;
我个人喜欢Form 1,因为optional
属性也被@ManyToOne
等注解使用,但是Form 2 也很好,因为它是在单个注解中完成的。
编辑
读完http://markmail.org/message/osod6rsauwbnkvya,我知道@Basic.optional
和@Column.nullable
之间的区别了。但我仍然不知道我应该使用哪一个。包含这两个注释似乎很好,所以要明确定义基础表,并在实际更新之前在 JPA 中检查 null 可能会稍微快一些。
【问题讨论】:
@Basic(optional = false) vs @Column(nullable = false) in JPA的可能重复 【参考方案1】:来自 API 文档:
@Basic:
@Basic 注解是最简单的类型 映射到数据库列。这 基本注释可以应用于 持久性属性或实例 以下任何一项的变量 类型:Java 原始类型、包装器 原始类型的字符串, java.math.BigInteger, java.math.BigDecimal,java.util.Date, java.util.Calendar,java.sql.Date, java.sql.Time, java.sql.Timestamp, 字节[],字节[],字符[],字符[], 枚举,以及任何其他类型 实现可序列化。
@Column
@Column 用于指定一个映射的 持久属性的列或 场地。如果没有列注释 指定,默认值为 已申请。
因此,如果您不指定 @Column
,它将从 getter/setter 派生列值。
如果你需要指定列名你必须@Column
注解。
@Basic
允许您指定获取类型。如果你想改变默认的获取类型,你必须使用这个注解,否则你可以省略它。
【讨论】:
见***.com/questions/2899073/… @Reddy - 所以,只有@Basic
就像说为所述变量创建数据库列NOT NULL
?那么为什么有两种方法可以做同样的事情呢?以上是关于JPA:我应该使用哪个?基本(可选)或列(可为空)?的主要内容,如果未能解决你的问题,请参考以下文章