JPA和Hibernate注解的继承问题

UUID类型的主键字段是长度为32的字符类型,Hibernate中自带自动生成UUID类型的主键,但有的时候需要自定义长32的字符串最为主键值,因此这里就有了一个分类关系:系统自带的UUID和用户自定义的UUID都有一个共性,都是一个长32的字符。我们基于此创建一个继承体系。


// UUIDBase.java
@MappedSuperclass
public abstract class UUIDBase {

protected String id;

@Id
@Column(nullable=false, updatable=false, length=32)
public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}


// UUIDSystem.java
@MappedSuperclass
public abstract class UUIDSystem extends UUIDBase {
@Override
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy="uuid")
public String getId() {
return id;
}
}


// UUIDCustom.java
@MappedSuperclass
public abstract class UUIDCustom extends UUIDBase {
@Override
@GeneratedValue(generator="custom-uuid")
@GenericGenerator(name="custom-uuid", strategy="package.IDGenerator")
public String getId() {
return id;
}
}


// POJO.java
@Entity
public class POJO extends UUIDCustom {
//...
}

但是如果这样做的话如果对POJO进行操作的时候,会出现如下的异常:
org.hibernate.MappingException: Repeated column in mapping for entity

如果将UUIDBase修改如下:

// UUIDBase.java
@MappedSuperclass
public abstract class UUIDBase {

protected String id;

@Id
@Column(nullable=false, updatable=false, length=32)
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy="uuid")
public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}

这个时候无论子类中getId()方法使用什么注解都是无效的,最终主键还是按照父类的主键生成器。

为了避免出现这样的错误,建议将主键的注解一步到位,不要使用继承扩展的方式。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注