Hibernate实体中的多个SequenceGenerator

3

在 Hibernate 实体类中使用 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;

}
3个回答

1

您的主键应该只有一个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。


对我有用...谢谢 :) - Siddharth Agarwal
Oracle怎么样?另外,您如何提供第二个序列的名称? - Maulik Kayastha

0

在列级别而不是类级别定义@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在字段级别上是允许的,所以它应该可以工作。


不是真的!如果你有任何成功的经验,请告诉我们。 - Śhāhēēd

0

技巧是在序列生成器上添加@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上进行了测试


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接