Java Persistence / JPA:@Column vs @Basic

时间:2009-09-05 12:28:01

标签: java jpa persistence

JPA中@Column@Basic注释之间的区别是什么?它们可以一起使用吗? 应该一起使用吗?或者其中一个是否足够?

4 个答案:

答案 0 :(得分:140)

  • @Basic表示要保留属性并使用标准映射。它有一些参数,允许您指定是否要延迟加载属性以及它是否可以为空。

  • @Column允许您指定数据库中要保留该属性的列的名称。

如果您指定一个没有另一个,那么您将获得合理的默认行为,因此通常人们只使用一个,但特殊情况除外。

因此,如果我们想要延迟加载属性并指定列名,我们可以说

 @Basic(fetch=FetchType.LAZY)
 @Column(name="WIBBLE")

如果我们需要默认的非懒惰行为,那么仅@Column就足够了。

答案 1 :(得分:47)

除了@djna's answer之外,值得注意的是@Basic应与@OneToMany@ManyToOne@ManyToMany进行比较。在任何属性中只能指定其中一个。

可以指定

@Column@JoinColumn以及其中任何一个来描述数据库列属性。

这两组注释可以一起使用,但每次只能使用一组注释。

答案 2 :(得分:21)

值得注意的是,Basic是为原始字段设计的

http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes

  

基本属性是属性类是简单类型的属性,例如String,Number,Date或基元。基本属性的值可以直接映射到数据库中的列值。

     

支持的类型和转换取决于JPA实现和数据库平台。使用不直接映射到数据库类型的类型的任何基本属性都可以序列化为二进制数据库类型。

     

在JPA中映射基本属性的最简单方法是什么都不做。任何没有其他注释且不引用其他实体的属性都将自动映射为基本属性,如果不是基本类型,甚至可以序列化。该属性的列名将默认,名称与属性名称相同,为大写。

答案 3 :(得分:1)

@Basic批注适用于JPA实体,@ Column的适用于数据库列 @Basic批注的可选属性定义了实体字段是否可以为null。另一方面,

  • @Column批注的nullable属性指定相应的数据库列是否可以为空
  • 我们可以使用@Basic指示应延迟加载字段
  • @Column批注允许我们指定映射的数据库列的名称
  • @Basic批注将属性在Java对象级别上标记为非可选。列映射上的(nullable = false)仅负责生成NOT NULL数据库约束。