JPA 中的 @Column
和 @Basic
注释有什么区别?它们可以一起使用吗? 应该它们一起使用吗?或者其中一个就足够了?
@Basic 表示要保留属性并使用标准映射。它具有允许您指定属性是否要延迟加载以及是否可以为空的参数。
@Column 允许您指定数据库中要保存属性的列的名称。
如果您指定一个而没有另一个,那么您将获得合理的默认行为,因此除了特殊情况外,通常人们只使用一个。
因此,如果我们想要延迟加载属性并指定列名,我们可以说
@Basic(fetch=FetchType.LAZY)
@Column(name="WIBBLE")
如果我们需要默认的非惰性行为,那么只需 @Column
就足够了。
除了 @djna's answer 之外,值得注意的是,@Basic
应与 @OneToMany
、@ManyToOne
和 @ManyToMany
进行比较。在任何属性上只能指定其中之一。
@Column
和 @JoinColumn
可以与其中任何一个一起指定以描述数据库列属性。
这是可以一起使用的两组注解,但每组一次只能使用一个注解。
值得注意的是,Basic 是为原始字段设计的
http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes
基本属性是属性类是简单类型(例如字符串、数字、日期或原始类型)的属性。基本属性的值可以直接映射到数据库中的列值。支持的类型和转换取决于 JPA 实现和数据库平台。任何使用不直接映射到数据库类型的类型的基本属性都可以序列化为二进制数据库类型。在 JPA 中映射基本属性的最简单方法是什么都不做。任何没有其他注释且不引用其他实体的属性将被自动映射为基本类型,如果不是基本类型,甚至会被序列化。属性的列名将被默认,命名与属性名相同,为大写。
@Basic 注解应用于 JPA 实体,@Column 应用于数据库列 @Basic 注解的可选属性定义实体字段是否可以为空;另一方面,
@Column注解的可空属性指定对应的数据库列是否可以为空
我们可以使用@Basic 来指示一个字段应该被延迟加载
@Column 注解允许我们指定映射的数据库列的名称
@Basic 注释将属性标记为在 Java 对象级别上不是可选的。而(nullable = false) 对列映射,只负责生成一个NOT NULL 数据库约束。
@Column
的情况下使用@Basic
,这就是optional
和nullable
属性同时存在的原因。我对吗?