首要的关键

可用

@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注释,还可以为方法编写:用于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,而不是复述官方文档。

评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论