繁体   English   中英

具有不同主键的休眠继承

[英]Hibernate inheritance with different primary key

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

列是正确的,schama 是我想要的,但我想从 PotencialRegister 主键中删除“id”成员。

您可以创建另一个没有 @Id 列的类,并将此类用作每种类型的 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 属性

在每个类层次结构的表中,假定 Version 和 Id 属性都是从根类继承的。 如果我没有错,那么您不能在单个类/类层次结构中使用多个 Id 属性。 在您的情况下,您可以在基类中放置跨表通用的属性,并仅在特定类(代表单个表)中使用 Id 属性。

您不能将 userId 重新定义为主键: https : //hibernate.atlassian.net/browse/HHH-11771 所以我相信你应该考虑将 userId 从抽象类移动到带有适当注释的实现中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM