对于这个类,我希望这个类的 ID 是它所有属性的值。这隐含地意味着我只需要在数据库中存在这些值的行。如何在休眠中做到这一点?
public class WeatherState {
private String weatherType;
private double temperature;
}
对于这个类,我希望这个类的 ID 是它所有属性的值。这隐含地意味着我只需要在数据库中存在这些值的行。如何在休眠中做到这一点?
public class WeatherState {
private String weatherType;
private double temperature;
}
当持久性属性应该直接是 WeatherState 的属性时,@IdClass是一种方式(持久性注解是从 javax.persistence 包中导入的):
@Entity
@IdClass(WeatherStateId.class)
public class WeatherState {
@Id private String weatherType;
@Id private double temperature;
//getters, setters
}
public class WeatherStateId implements Serializable {
private String weatherType;
private double temperature;
//getters, setters, equals, hashcode
}
其他选项是使用@EmbeddedId:
@Entity
public class WeatherState {
@EmbeddedId private WeatherStateId weatherStateId;
public WeatherStateId getWeatherStateId() {
return weatherStateId;
}
public void setWeatherStateId(WeatherStateId weatherStateId) {
this.weatherStateId = weatherStateId;
}
}
@Embeddable
public class WeatherStateId implements Serializable {
private String weatherType;
private double temperature;
//getters, setters, equals, hashcode
}
在这两种情况下,提供 equals 和 hashcode 都很重要,如 JPA 2.0 规范中所述:
主键类必须定义 equals 和 hashCode 方法。这些方法的值相等语义必须与键映射到的数据库类型的数据库相等一致。