解答:Hibernate的註解方式可以用來定義聯合主鍵,使用@Embeddable和@EmbeddedId註解。
一、@Embeddable和@EmbeddedId註解
在Hibernate註解中,使用@Embeddable註解的類中可以嵌入其他屬性,而這些屬性可以被@EmbeddedId註解的類所使用。@Embeddable註解的類中的getter和setter方法可以直接被使用@EmbeddedId註解的類所訪問和修改。
示例代碼:
@Embeddable
public class UserId implements Serializable {
private String firstName;
private String lastName;
public UserId() {}
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
}
@Entity
public class User {
@EmbeddedId
private UserId id;
private String email;
private String password;
// getters and setters ...
}
二、自定義主鍵生成策略
在@EmbeddedId註解的類中,可以自定義主鍵生成策略,支持的策略包括IDENTITY、SEQUENCE、TABLE、AUTO、NONE等。在@Id註解中也可以定義主鍵生成策略。
示例代碼:
@Entity
@IdClass(CompositePrimaryKey.class)
public class User {
@Id
private String firstName;
@Id
private String lastName;
private String email;
private String password;
// getters and setters ...
}
public class CompositePrimaryKey implements Serializable {
private String firstName;
private String lastName;
public CompositePrimaryKey() {}
public CompositePrimaryKey(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// getters and setters ...
}
@Entity
@TableGenerator(
name = "user_gen",
table = "id_gen",
pkColumnName = "gen_name",
valueColumnName = "gen_val",
allocationSize = 100
)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "user_gen")
private long id;
@EmbeddedId
private UserIdentity userIdentity;
// other fields
}
三、複合主鍵的繼承關係
在複合主鍵的繼承關係中,子類需要重新定義父類的主鍵屬性,並在@EmbeddedId註解中定義子類的主鍵屬性。
示例代碼:
@Entity
public class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Embedded
private VehicleRegistration registration;
// getters and setters ...
}
@Embeddable
public class VehicleRegistration {
private String registrationNumber;
private String registrationCountry;
// getters and setters ...
}
@Entity
@AttributeOverrides({
@AttributeOverride(name = "registrationNumber", column = @Column(name = "bike_reg_no")),
@AttributeOverride(name = "registrationCountry", column = @Column(name = "bike_reg_country"))
})
public class Bike extends Vehicle {
@EmbeddedId
private VehicleRegistration registration;
// getters and setters ...
}
@Entity
@AttributeOverrides({
@AttributeOverride(name = "registrationNumber", column = @Column(name = "car_reg_no")),
@AttributeOverride(name = "registrationCountry", column = @Column(name = "car_reg_country"))
})
public class Car extends Vehicle {
@EmbeddedId
private VehicleRegistration registration;
// getters and setters ...
}
以上就是關於Hibernate註解聯合主鍵的詳細闡述,其中包括了@Embeddable和@EmbeddedId註解、自定義主鍵生成策略以及複合主鍵的繼承關係。掌握了這些知識,您將能夠更好地使用Hibernate註解方式定義聯合主鍵。
原創文章,作者:RYCWO,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/375349.html