Java持久性/ JPA:@Column与@Basic


119

JPA中的@Column@Basic批注有什么区别?它们可以一起使用吗?如果他们可以一起使用吗?还是其中之一就足够了?

Answers:


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

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

如果您指定一个不带另一个,那么您会得到明智的默认行为,因此,除特殊情况外,通常人们只使用一个。

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

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

如果我们选择了默认的非懒惰行为,那么只需@Column足够了。


2
这是一个明确的答案。谢谢。因此,我假设@Basic没有可以使用@Column,这就是optionalnullable属性都存在于其中的原因。我对吗?
Hosam Aly

1
我并不是声称要完全理解JPA规范中有关@Basic的nullable和@Column的nullable之间的区别以及既不指定又不指定二者的效果。@null可为空被描述为与架构生成相关的“提示”。@Column nullable被描述为定义数据库中列的特征。我的做法是使用@Column案例。
2009年

16
在保存到数据库之前,持久性提供程序将在运行时检查@Basic(可选)。@column是一个列定义在数据库中,并且用于架构生成:stackoverflow.com/questions/2899073/...
彼得Gwiazda

2
那个“不偷懒”的人称为EAGER。大声笑
solvator

7
JPA注释可以分为两类:纯关系注释与实现注释。纯关系注释包含:Entity,Basic,OneToOne,OneToMany,ManyToMany等,而实现注释则提供了有关如何将纯理论模型映射到真实数据库的线索:表,列,...在您的问题“基本”中'是一个注释,用于提供有关关系实体属性的信息,而'Column'提供有关如何将其映射到数据库列的信息。
Bruno Ranschaert

50

除了@ DJNA的答案,但值得注意的是,@Basic应该进行比较@OneToMany@ManyToOne@ManyToMany。只能在任何属性上指定其中之一。

@Column并且@JoinColumn可以沿着指定与任何这些描述数据库列属性。

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


21

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

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

基本属性是一种属性,其中属性类是简单类型,例如字符串,数字,日期或基元。基本属性的值可以直接映射到数据库中的列值。

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

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


好注意 谢谢。
Hosam Aly

1
否,如果未指定任何列注释,则将应用默认值(名称将是属性1)。
加布2015年

2

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

  • @Column批注的nullable属性指定相应的数据库列是否可以为null
  • 我们可以使用@Basic指示应延迟加载字段
  • @Column批注允许我们指定映射的数据库列的名称
  • @Basic批注将属性在Java对象级别上标记为非可选。并且(nullable = false)在列映射上,仅负责生成NOT NULL数据库约束。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.