首要的關鍵

開放

@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,而不是複述官方文檔。

留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言