@Id註解
Hibernate 中的每個 Entity 實體都必須有一個字段作為主鍵:它包含該類所有對象的唯一值。通常,此字段使用@Id註釋進行註釋。
一般形式:
@Id
Class Name;
例子:
@Entity
@Table(name="user")
class User
{
@Id
@Column(name="id")
public Integer id;
@Embedded
public UserAddress address;
@Column(name="created_date")
public Date createdDate;
}
註釋放置
順便說一句,您不僅可以為字段編寫@Column註釋,還可以為方法編寫@Column 註釋:用於getter 或setter。例子:
@Entity
@Table(name="user")
class User
{
public Integer id;
public Date createdDate;
@Id
@Column(name="id")
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="created_date")
public Date getDate() {
return this.createdDate;
}
public void setCreatedDate(Date date) {
this. createdDate = date;
}
}
當開始不僅向類而且向接口添加註解時,出現了這種方法。該接口沒有類字段,但有方法:getter 和 setter。Hibernate 支持這兩種標準。
重要的!如果一個類有@Entity註釋,那麼它的所有字段都被 Hibernate 視為持久字段(除非它們指定了@Transient註釋)。即使字段根本沒有任何註解:在這種情況下,列名被認為等於類字段名。
這是@Id註釋發揮重要作用的地方。如果註釋放在類字段上,那麼 Hibernate 將查看字段的名稱和類型。如果@Id註釋放在方法上,那麼 Hibernate 將查看方法的名稱和類型。
示例 1:
@Entity
@Table(name="user")
class User
{
@Id
public Integer id;
public Date createdDate; //this field will be treated as if it had @Column(name=" createdDate ")
}
示例 2:
@Entity
@Table(name="user")
class User
{
public Integer id;
public Date createdDate;
@Id
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public Date getDate() { //this field will be treated as if it had @Column(name=”date ”)
return this.createdDate;
}
public void setCreatedDate(Date date) {
this. createdDate = date;
}
}
@GeneratedValue 註解
您可以自己為新對象分配一個 id,或者讓 Hibernate 擺佈它。為了讓 Hibernate 更好地理解如何為你的對象分配 ID,它有一個特殊的註解:
@GeneratedValue
該註釋通常標記與@Id註釋相同的字段。她有 4 種可能的 ID 分配策略:
- 汽車
- 身份
- 順序
- 桌子
具有指定策略的註解示例:
@Entity
@Table(name="user")
class User
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer id;
public Date createdDate;
}
如果沒有指定策略值,將選擇 AUTO 策略。AUTO 策略意味著 Hibernate 將主要根據 ID 字段的數據類型自行分配 ID。
為什麼要打字?是的,因為 ID 類型可能非常不同,例如,String 或 GUID。例子:
@Entity
@Table(name="user")
class User
{
@Id
@GeneratedValue
public UUID id;
public Date createdDate;
}
注意:歷史上,Java 中的 GUID 稱為 UUID。如果您要求,Hibernate 可以為您的對像生成唯一的 UUID。
各種@GeneratedValue 策略
如果您指定類型GeneratedValue(strategy = GenerationType.IDENTITY),那麼 Hibernate 會將 ID 設置委託給數據庫層。通常,這使用標記為 PRIMARY KEY、AUTOINCREMENT 的列。
但如果你希望你的 ID 是唯一的,並根據特定的算法生成,那麼你可以使用 GeneratedValue (strategy = GenerationType.SEQUENCE)註解,例如:
@Entity
@Table(name="user")
public class User {
@Id
@GeneratedValue(generator = "sequence-generator")
@GenericGenerator(
name = "sequence-generator",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "user_sequence"),
@Parameter(name = "initial_value", value = "4"),
@Parameter(name = "increment_size", value = "1")
}
)
private long userId;
// ...
}
生成 ID 的方法還有很多。例如,您可能有一個由多個列組成的複合唯一鍵。而在將對象寫入數據庫時,您需要填寫所有這些列。
我不會詳細介紹它們。不過,我們講座的目的是熟悉 Hibernate,而不是複述官方文檔。
GO TO FULL VERSION