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:我应该使用哪个?基本(可选)或列(可为空)?的主要内容,如果未能解决你的问题,请参考以下文章

打字稿'可选'(可为空)'?语法不起作用(部分)

实体框架核心 - 无法删除可选的可为空关系

JPA 可嵌入 PK 和可为空的字段

hibernate JPA:可选值生成

XmlCodeExporter 和可为空的类型

解构可为空的对象