@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,而不是复述官方文档。
GO TO FULL VERSION