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

Xiè*_*léi 11 java orm hibernate

对于简单的字符串字段

@Entity
class Foo {

    //1. @Basic(optional = false)
    //2. @Column(length = 100, nullable = false)
    String name;
}
Run Code Online (Sandbox Code Playgroud)

我需要使用@Column注释来限制名称的长度,但我对可以为空的属性感到困惑.虽然我正在使用其他注释@ManyToOne@OneToMany那些使用optional属性,但我想@Basic(optional)用来保持大多数注释均匀.但我不能限制名称的长度@Basic.

那么,我应该在哪里注释可空属性,@Basic或者@Column

编辑

简单地说,您更喜欢哪种形式:

表格1:

@Entity
class Foo {
    @Basic(optional = false)
    @Column(length = 100)
    String name;
}
Run Code Online (Sandbox Code Playgroud)

表格2:

@Entity
class Foo {
    @Column(length = 100, nullable = false)
    String name;
}
Run Code Online (Sandbox Code Playgroud)

我个人喜欢Form 1,因为optional属性也被其他@ManyToOne注释使用,但是Form 2也很好,因为它是在单个注释中完成的.

编辑

阅读http://markmail.org/message/osod6rsauwbnkvya后,我@Basic.optional和之间有区别@Column.nullable.但我仍然不知道应该使用哪一个.包含两个注释似乎很好,因此要很好地定义基础表,并在实际更新之前稍微更快地检查JPA中的null.

Red*_*ddy 10

从API文档:

@basic:

@Basic注释是到数据库列的最简单的映射类型.Basic注释可以应用于以下任何类型的持久属性或实例变量: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允许您指定获取类型.如果要更改默认提取类型,则必须使用此批注,否则可以省略它.

  • 见http://stackoverflow.com/questions/2899073/basicoptional-false-vs-columnnullable-false-in-jpa (3认同)