使用不同主键

时间:2017-11-07 02:05:03

标签: java hibernate inheritance mappedsuperclass table-per-class

我尝试使用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主键的成员。

3 个答案:

答案 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从抽象类移至带有适当注释的实现。