解答: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/n/375349.html