tangguo

oracle上的hibernate序列@GeneratedValue(strategy = GenerationType.AUTO)

java

我使用@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);


阅读 517

收藏
2020-10-18

共1个答案

小编典典

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

这是预期的行为。使用时@GeneratedValue(strategy = GenerationType.AUTO),JPA提供程序将为特定数据库选择适当的策略。对于Oracle,这将是SEQUENCE,并且由于您未指定任何内容,因此Hibernate将使用名为的单个全局序列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;
2020-10-18