繁体   English   中英

Hibernate实体中的多个SequenceGenerator

[英]Multiple SequenceGenerator in Hibernate Entity

是否可以在 Hibernate 实体 Class 中使用 2 个序列生成器。我想为我的案例使用两个序列生成器,一个用于主键,另一个用于简单字段。 我怎样才能达到同样的效果?

@Data
@Table(name="a_b")
@SequenceGenerator(name = "a1_seq", sequenceName = "a1_seq", allocationSize    = 1)
@SequenceGenerator(name = "b1_seq", sequenceName = "b1_seq", allocationSize = 1)
public class ABC {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "a1_seq")
    private Integer id;

    @Column(name = "c")
    private String c;

    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "b1")
    @Column(name = "b)
    private Integer b;

}

您应该只有一个SequenceGenerator作为主键:

@Id
@Column(name = "id")
@SequenceGenerator(name = "a1_seq", sequenceName = "a1_seq", allocationSize    = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "a1_seq")
private Integer id;

对于外键,您可以:

@Column(name = "b, columnDefinition="serial")
private Integer b;

应该适用于PostgreSQL。

在列级别而不是在类级别定义@SequenceGenerator。 因此,您可以为两个不同的列创建两个单独的sequenceGenerator-a1_seq和b1。

@Data
@Table(name="a_b")

public class ABC {

  @Id
  @Column(name = "id")
  @SequenceGenerator(name = "a1_seq", sequenceName = "a1_seq", allocationSize    = 1)
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "a1_seq")
  private Integer id;

  @Column(name = "c")
  private String c;

  @SequenceGenerator(name = "b1_seq", sequenceName = "b1_seq", allocationSize = 1)
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "b1")
  @Column(name = "b)
  private Integer b;

}

这应该工作。 我尚未对其进行测试,但是由于SequenceGenerator在字段级别允许使用,因此它应该可以工作。

技巧是为两个序列生成器添加@Id 注释。 您可以使用@IdClass() 来实现这一点。

@Entity
@Table(name = "table_name")
@IdClass(DBSequenceId.class)
public class DBSequence implements Serializable {

    @Id
    @SequenceGenerator(name = "yourName1", sequenceName = "yourSeqName1", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "yourName1")
    @Column(name = "first_seq", updatable = false)
    protected int firstSeq;

    @Id
    @SequenceGenerator(name = "yourName2", sequenceName = "yourSeqName2", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "yourName2")
    @Column(name = "second_seq", updatable = false)
    protected int secondSeq;

}

class DBSequenceId implements Serializable {

    private int firstSeq;
    private int secondSeq;

    //Setters and getters are omitted 
}

在 MariaDB 上测试

暂无
暂无

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

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