首页 文章

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

提问于
浏览
20

我使用@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值会更新序列 . 在child上插入ID值,更新序列 . 在下一个父项插入时,序列...使用由子插入更新的值...

这个Annotations,不是创建两个序列,只有一个 . 这是正确/预期的吗?

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

3 回答

  • 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 . 这对很多人来说已经足够了 .

    现在,可以使用 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;
    
  • 1

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

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

  • 45
    @Entity
    @Table(name = "table_seq")
    @SequenceGenerator(name= "NAME_SEQUENCE", sequenceName = "SEQ_ID", initialValue=1, allocationSize = 1)
    public class SeqEntity implements Serializable {
      private static final long serialVersionUID = 1L;
    
     @Id
     @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="NAME_SEQUENCE")
     private Long id;
    
    }
    

相关问题