簡體   English   中英

Hibernate,id,oracle,sequence

[英]Hibernate, id, oracle, sequence

我的數據庫是Oracle,我的id列值是一個Oracle序列,這個序列由一個觸發器執行,因此,在插入每一行之前,這個觸發器使用這個序列來獲取id值。 所以我很困惑我應該在我的實體類中定義哪個id策略生成。

@GenericGenerator(name = "generator", strategy = "increment")
@Id
@GeneratedValue(generator = "generator")

要么

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "idGenerator")
@SequenceGenerator(name="idGenerator", sequenceName="ID_SEQ")

要么

@Id
@GeneratedValue(strategy = GenerationType.AUTO)

真的很困惑,有人會對這個問題有所了解嗎? 請清楚解釋..

我還有一個projet,其中一個Oracle DB為我的@Entity類提供數據。 如上所述,序列通過觸發器生成表的PK的id。 這是我在其中一個類中使用的注釋:

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "G1")
@SequenceGenerator(name = "G1", sequenceName = "LOG_SEQ")
@Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)
public int getId() {
    return this.id;
}

這是您在帖子中顯示的第二種語法。 Java代碼中沒有調用觸發器,因為觸發器由DB管理。 我記得如果我不想遇到問題,我必須在數據庫中同時擁有序列和觸發器。 觸發器詢問要插入的行的id是null還是= 0.在這種情況下,調用序列LOG_SEQ。

因此,如果您為實體的@Id提供一個值,它可以插入到DB中(如果該Id不存在),則不會調用該序列。 嘗試查看觸發器的代碼以確切了解它發生了什么。

暫無
暫無

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

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