JPA:我应该使用哪个?基本(可选)或列(可空)?

时间:2011-04-09 04:38:02

标签: java hibernate orm

对于简单的字符串字段,

@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可能稍快一些。

1 个答案:

答案 0 :(得分:10)

来自API文档:

@Basic:

  

@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注释   指定,默认值为   应用

因此,如果您未指定@Column,则它会从getter / setter派生列值。 如果您需要指定列名,则必须@Column注释。

@Basic允许您指定抓取类型。如果要更改默认提取类型,则必须使用此批注,否则可以省略它。