我正在尝试使用 TABLE_PER_CLASS 策略创建继承,但我希望每个表都有不同的主键,这可能吗?
我有一个类 Register,它有数百万个实例,其中一些实例是“特殊的”,并且它们的列和额外列有不同的规则。
@MappedSuperclass
public abstract class Register {
@Id
@Column(nullable = false, unique = true, updatable = false)
private Long userId;
private Date checked;
@Column(nullable = false)
private RegisterState tipo;
}
@Entity
@AttributeOverrides({ @AttributeOverride(name = "userId", column = @Column(nullable = false, unique = false, updatable = false)) })
public class PotencialRegister extends Register implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(length = 64, nullable = false, unique = false)
private String referer;
}
对于基本寄存器,我不需要 Id 属性,因为我有一个唯一的列,但对于专用实体,该列不是唯一的,因此我添加了一个额外的属性。
问题是hibernate正在使用父id来创建复合主键(生成的模式是):
create table PotencialRegister (
id integer not null,
userId bigint not null,
checked datetime(6),
tipo integer not null,
referer varchar(64) not null,
primary key (id, userId)
)
create table Register (
userId bigint not null,
checked datetime(6),
tipo integer not null,
primary key (userId)
)
列是正确的,架构是我想要的,但我想从 PotencialRegister 主键中删除“id”成员。
最佳答案
您可以创建另一个没有 @Id 列的类,并使用该类作为每种类型的 Register 的基类。
所以你的 Register 类看起来像:
@MappedSuperclass
public abstract class Register {
@Column(nullable = false, unique = true, updatable = false)
private Long userId;
private Date checked;
@Column(nullable = false)
private RegisterState tipo;
}
现在,对于您的普通注册,您可以执行以下操作:
@Entity
public class NormalRegister extends Register implements Serializable{
@Id
public Long getUserId(){
return super.userId;
}
public void setUserId(Long uId){
super.userId=uId;
}
}
接下来将 PotencialRegister 类定义为:
@Entity
@AttributeOverrides({ @AttributeOverride(name = "userId", column = @Column(nullable = false, unique = false, updatable = false)) })
public class PotencialRegister extends Register implements Serializable {
private Integer id;
@Column(length = 64, nullable = false, unique = false)
private String referer;
@Id
public Long getUserId(){
return super.userId;
}
public void setUserId(Long uId){
super.userId=uId;
}
}
这样,基类中就没有 Id,所有子类都可以定义自己的 Id 属性
关于java - 具有不同主键的 Hibernate 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47148864/