簡體   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