Oracle上的Hibernate sequence,@GeneratedValue(strategy = GenerationType.AUTO)

2022-09-01 20:06:34

我@GeneratedValue(strategy = GenerationType.AUTO)来生成我的实体上的ID。

我现在不知道它是如何工作的,但是在我的子表上,生成遵循父序列的ID值。

//parent table
@Entity
@Table (name = "parent")
public class Parent {

    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    @Column (name = "id")
    private long id;


    @OneToMany (cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
    @JoinColumn (name = "parentId")
    @ForeignKey (name = "FKparent")
    private List<child> child;

}

//child table
@Entity
@Table (name = "child")
public class Child {

    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    @Column (name = "id")
    private long id;
}

父项上插入的 ID 值将更新序列。在子项上插入的 ID 值将更新序列。在下一次插入父项时,序列...使用由子插入更新的值...

这个注释不是创建两个序列,而是创建一个序列。这是正确/预期的吗?

我仅使用使用我的 DAO 服务插入我的实体entityManager.persist(parent);


答案 1

这些注释不是创建两个序列,而只是创建一个序列。这是正确/预期的吗?

这是预期的行为。当使用 时,JPA 提供程序将为特定数据库选择适当的策略。对于Oracle,这将是SEQUENCE,并且由于您没有指定任何内容,Hibernate将使用一个名为 的全局序列。@GeneratedValue(strategy = GenerationType.AUTO)hibernate_sequence

这是正确的吗?好吧,我不知道,这取决于你的需求。以防万一,Oracle 序列的默认最大值为 1E+27,即 1,000,000,000,000,000,000,000,000,000,000。000。这对许多人来说已经足够了。

现在,当数据库使用序列时,可以使用并仍然控制序列的名称:GenerationType.AUTO

@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
private Long id;

答案 2

是的,这是正确和预期的。

您可以为每个表创建单独的序列,但恕我直言,这只是额外的代码,没有实际的好处。


推荐