簡體   English   中英

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

[英]Hibernate sequence on oracle, @GeneratedValue(strategy = GenerationType.AUTO)

我使用@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服務中插入了我的實體entityManager.persist(parent);

這些注釋不會創建兩個序列,只有一個。 這是正確/預期的嗎?

這是預期的行為。 使用@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;

是的,這是正確和預期的。

您可以為每個表創建單獨的序列,但恕我直言,這只是額外的代碼,沒有實際的好處。

@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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM