【问题标题】:Hibernate sequence on oracle, @GeneratedValue(strategy = GenerationType.AUTO)oracle 上的休眠序列,@GeneratedValue(strategy = GenerationType.AUTO)
【发布时间】:2011-03-05 08:45:37
【问题描述】:

我正在使用@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 值会更新序列。 在父级的下一次插入中,序列...使用由子级插入更新的值...

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

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

【问题讨论】:

    标签: java oracle hibernate orm


    【解决方案1】:

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

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

    这是正确的吗?嗯,我不知道,这取决于你的需求。以防万一,Oracle 序列的默认最大值是 1E+27,或 1,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;
    

    【讨论】:

    • Pascal,但是如果你想使用 GenerationType.AUTO 来允许 MySQL 等其他数据库使用 Identity Insert,这是行不通的,不是吗?因为你手动指定了一个生成器
    【解决方案2】:

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

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

    【讨论】:

    • 如果最终用户看到该键并被它“跳跃”误导,则不会。并且不要告诉我密钥需要对用户隐藏,这并不总是可能的......
    • 没有办法保持 id 在时间上保持恒定、单调且序列中没有空洞,这不会破坏可伸缩性。我也没有看到“jumpy”的有用定义以及为什么用户需要 unjumpy ID。
    【解决方案3】:
    @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;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 2012-02-15
      • 2015-09-13
      • 2011-04-05
      • 2016-01-10
      相关资源
      最近更新 更多