我尝试使用TABLE_PER_CLASS策略创建继承,但我希望每个表都有不同的主键吗?
我有一个类注册,它有数百万个实例,其中一些是"特殊的"并且对他们的列和额外的列有不同的规则。
@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)
)
列是正确的,schama是我想要的,但我想删除" id"来自PotencialRegister主键的成员。
答案 0 :(得分:6)
您可以创建另一个没有@Id列的类,并将此类用作每种类型的Register的基类。
所以你的Register类看起来像:
c("black", "blue", "pink", "red")
现在,您可以执行以下常规注册:
@MappedSuperclass
public abstract class Register {
@Column(nullable = false, unique = true, updatable = false)
private Long userId;
private Date checked;
@Column(nullable = false)
private RegisterState tipo;
}
接下来,您将PotencialRegister类定义为:
@Entity
public class NormalRegister extends Register implements Serializable{
@Id
public Long getUserId(){
return super.userId;
}
public void setUserId(Long uId){
super.userId=uId;
}
}
这样你就没有基类中的Id,所有子类都可以定义自己的Id属性
答案 1 :(得分:1)
在每个类层次结构的表中,假定Version和Id属性都是从根类继承的。如果我没有错,那么您不能在单个类/类层次结构中使用多个Id属性。在基类中,您可以放置表中常见的属性,并仅在特定类(表示各个表)中使用Id属性。
答案 2 :(得分:0)
您不能将userId重新定义为主键:https://hibernate.atlassian.net/browse/HHH-11771。 因此,我相信您应该考虑将userId从抽象类移至带有适当注释的实现。