背景:使用JPA设计对象,偶尔会用到继承(extends)或者嵌入类(@Embedded)的形式。父类、嵌入类中的属性已经定义了数据库字段约束(或者默认),但该类希望修改继承或者嵌入字段的名称、非空、唯一、长度等约束。比如:父类有一个姓名的属性name,对应的数据库字段定义为@Column(name="name",nullable=false)。但子类希望不要非空约束,允许为空。那么应该怎么办么?
实现方法:
如果是继承就在子类的类定义上添加注解如下:
@AttributeOverrides(value = {
@AttributeOverride(name = "name", column = @Column(name = "name", nullable = true))
})
public class xxxxx{
如果是嵌入类,就在嵌入类作为本类的属性定义处使用@AttributeOverrides修改。如下:
@Embedded
@AttributeOverrides(value = {
@AttributeOverride(name = "name", column = @Column(name = "name", nullable = true)) })
private RequestRecord requestRecord;
注意:@AttributeOverride(name = "name", column = @Column(name = "name", nullable = true)中的第一个"name",是指的对象的属性名称,第二个"name"是指的对应数据库字段的名称。如果要把继承或者嵌入的字段名称修改一下。那么就要修改第二个"name"的内容,如下:
@AttributeOverride(name = "name", column = @Column(name = "your_new_name", nullable = true)
小结:使用继承、或者嵌入类的方式定义对象,使得对象之间的关系变得立体丰富、有血有肉,更加准确的表达了对象之间的关系。存储策略上如果要调整,直接去修改父类或者被嵌入类的字段存储定义带有侵入性。通过在子类上或者嵌入类属性定义上使用@AttributeOverrides注解,实现了存储策略修改,极致优雅。