我正在尝试使用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,primary key (userId) )
列是正确的,schama是我想要的,但我想从PotencialRegister主键中删除“id”成员.
解决方法
您可以创建另一个没有@Id列的类,并将此类用作每种类型的Register的基类.
所以你的Register类看起来像:
@MappedSuperclass public abstract class Register { @Column(nullable = false,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",updatable = false)) }) public class PotencialRegister extends Register implements Serializable { private Integer id; @Column(length = 64,unique = false) private String referer; @Id public Long getUserId(){ return super.userId; } public void setUserId(Long uId){ super.userId=uId; } }
有了这个,你没有基类中的Id,所有子类都可以定义自己的Id属性