2011-04-09 88 views
10

对于简单的字符串字段,JPA:我应该使用哪个?基本(可选)或列(可空)?

@Entity 
class Foo { 

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

我需要使用@Column注解来限制名字的长度,但我很困惑与可空属性。虽然我使用的其他注释类似@ManyToOne@OneToMany,但使用optional属性,我希望使用@Basic(optional)来保持大多数注释的统一。但是我不能用@Basic来限制名字的长度。

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

编辑

简单的说,以何种形式,你会喜欢:

表1:

@Entity 
class Foo { 
    @Basic(optional = false) 
    @Column(length = 100) 
    String name; 
} 

表2:

@Entity 
class Foo { 
    @Column(length = 100, nullable = false) 
    String name; 
} 

嗯,我个人喜欢表1,因为optional属性也被@ManyToOne等注解使用,但表单2也很好,因为它是在单个注释中完成的。

编辑

阅读http://markmail.org/message/osod6rsauwbnkvya后,我有@Basic.optional@Column.nullable之间的差异。但我仍然不知道应该使用哪一个。包含两个注释似乎都很好,所以要使底层表格定义得更好,并且在实际更新之前检查null可能稍微快一点。

+1

[@Basic(可选= false)vs @Column(nullable = false)在JPA]中的可能重复(http://stackoverflow.com/questions/2899073/basicoptional-false-vs-columnnullable-false-in- jpa) – rds 2013-06-18 09:34:58

回答

9

从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, byte [],Byte [],char [],Character [], 枚举,以及 实现Serializable的任何其他类型。

@Column

@Column用来为持久属性或 字段中指定映射 列。如果未指定Column注释 ,则应用默认值 。

所以,如果你没有指定@Column它从getter/setter派生列值。 如果您需要指定列名称,则必须注释@Column

@Basic允许您指定提取类型。如果你想改变默认的抓取类型,你必须使用这个注解,否则你可以忽略它。

+3

查看http://stackoverflow.com/questions/2899073/basicoptional-false-vs-columnnullable-false-in-jpa – Reddy 2011-04-09 05:19:47

+0

@Reddy - 所以,只有'@ Basic'就像是说让数据库列'NOT NULL“的变量?那么为什么有两种方法来做同样的事情呢? – 2014-05-10 00:13:31