java – 使用不同主键的Hibernate继承

我正在尝试使用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属性

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...