java - 具有不同主键的 Hibernate 继承

标签 java hibernate inheritance mappedsuperclass table-per-class

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

相关文章:

java - Quickblox 登录无法使用 3.3.1 sdk

C++覆盖子类创建的对象的功能

hibernate - 约束验证失败后,内存中的对象无效

c++ - 嵌套类继承错误

c++ - 为代码重用而不必要地使用虚函数

java - 如何在不创建另一个类的情况下创建内部 child ?

java - 由于 continue,for 循环数组中的基本 else 语句被忽略

java - 监听 WritableList 中的变化

java - 在 Spring/Hibernate 中正确使用缓存

performance - 如何使用 oracle 数据库加速 hibernate 条件 'ilike queries'