Hibernate:为复合 PK、FK 的 mappedBy 属性指定正确的值
Hibernate: Specifying correct value for mappedBy attribute for composite PK, FK
我想了解两个实体之间的 OneToOne 映射。
我无法理解如何在 OneToOne
中指定 mappedBy
属性以使其成为双向关系。
UserID 可嵌入类型:
@Embeddable
public class UserID implements Serializable {
private static final long serialVersionUID = 1L;
private int ssnID;
private int uniqueNum;
// getters and setters..
}
VehicleID 可嵌入类型:
@Embeddable
public class VehicleID implements Serializable {
private int vehicleID;
private int regNum;
// getters and setters
}
具有复合主键 VehicleID 的车辆实体:
@Entity
public class Vehicle {
@EmbeddedId
private VehicleID vehicleID;
private String description;
// getters and setters..
}
UserInfo 实体具有复合主键 UserID,并且是 UserInfo 和 Vehicle 之间 OneToOne 关系的拥有方实体:
@Entity
public class UserInfo {
private String full_name;
@EmbeddedId
UserID userID;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumns({@JoinColumn(name="vehicle_ID") , @JoinColumn(name="reg_Num")}) // Composite primary key in Vehicle
Vehicle veh;
// getters, setters and other code
}
UserInfo
是拥有方实体,与 Vehicle
实体(具有复合 VehicleID 作为主键)具有 OneToOne
关系。
我的疑惑在这里:
在 UserInfo
实体中,我们指定 OneToOne
关系(和注释):
@OneToOne(cascade=CascadeType.ALL)
@JoinColumns({@JoinColumn(name="vehicle_ID") , @JoinColumn(name="reg_Num")})
Vehicle veh;
如上所示,在 UserInfo
table 中,我们在 Vehicle
table 上有一个复合外键,[=25= 的名称] 指定为 vehicle_ID
和 reg_Num
.
现在,当我想让它成为双向关系时,我们需要使用 mappedBy
属性,这是我无法理解 属性 所指的地方。
@Ent/ity
public class Vehicle {
@EmbeddedId
private VehicleID vehicleID;
private String description;
@OneToOne(mappedBy="UserID")
private UserInfo userInfo;
// getters and setters..
}
我保留了 "UserID",因为它是 UserInfo 的 "composite" 主键,但它抛出异常:
Exception in thread "main" org.hibernate.AnnotationException: Unknown
mappedBy in: com.example.entity.Vehicle.userInfo, referenced property
unknown: com.example.entity.UserInfo.UserID
我不明白 属性 在这里指的是什么;我在教程中看到的示例,它们中的大多数只有一个 PK,FK;但就我而言,它是复合 PK,FK。
谁能帮我理解一下?
应该是这样的:
@OneToOne(mappedBy="veh")
private UserInfo userInfo;
mappedBy
元素标识关系的反面。这里你有 Vehicle 和 UserInfo 之间的关系,所以要识别关系的反面应该由另一方使用它 属性。这里 veh
.
有关详细信息,请参阅 this
我想了解两个实体之间的 OneToOne 映射。
我无法理解如何在 OneToOne
中指定 mappedBy
属性以使其成为双向关系。
UserID 可嵌入类型:
@Embeddable
public class UserID implements Serializable {
private static final long serialVersionUID = 1L;
private int ssnID;
private int uniqueNum;
// getters and setters..
}
VehicleID 可嵌入类型:
@Embeddable
public class VehicleID implements Serializable {
private int vehicleID;
private int regNum;
// getters and setters
}
具有复合主键 VehicleID 的车辆实体:
@Entity
public class Vehicle {
@EmbeddedId
private VehicleID vehicleID;
private String description;
// getters and setters..
}
UserInfo 实体具有复合主键 UserID,并且是 UserInfo 和 Vehicle 之间 OneToOne 关系的拥有方实体:
@Entity
public class UserInfo {
private String full_name;
@EmbeddedId
UserID userID;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumns({@JoinColumn(name="vehicle_ID") , @JoinColumn(name="reg_Num")}) // Composite primary key in Vehicle
Vehicle veh;
// getters, setters and other code
}
UserInfo
是拥有方实体,与 Vehicle
实体(具有复合 VehicleID 作为主键)具有 OneToOne
关系。
我的疑惑在这里:
在 UserInfo
实体中,我们指定 OneToOne
关系(和注释):
@OneToOne(cascade=CascadeType.ALL)
@JoinColumns({@JoinColumn(name="vehicle_ID") , @JoinColumn(name="reg_Num")})
Vehicle veh;
如上所示,在 UserInfo
table 中,我们在 Vehicle
table 上有一个复合外键,[=25= 的名称] 指定为 vehicle_ID
和 reg_Num
.
现在,当我想让它成为双向关系时,我们需要使用 mappedBy
属性,这是我无法理解 属性 所指的地方。
@Ent/ity
public class Vehicle {
@EmbeddedId
private VehicleID vehicleID;
private String description;
@OneToOne(mappedBy="UserID")
private UserInfo userInfo;
// getters and setters..
}
我保留了 "UserID",因为它是 UserInfo 的 "composite" 主键,但它抛出异常:
Exception in thread "main" org.hibernate.AnnotationException: Unknown mappedBy in: com.example.entity.Vehicle.userInfo, referenced property unknown: com.example.entity.UserInfo.UserID
我不明白 属性 在这里指的是什么;我在教程中看到的示例,它们中的大多数只有一个 PK,FK;但就我而言,它是复合 PK,FK。
谁能帮我理解一下?
应该是这样的:
@OneToOne(mappedBy="veh")
private UserInfo userInfo;
mappedBy
元素标识关系的反面。这里你有 Vehicle 和 UserInfo 之间的关系,所以要识别关系的反面应该由另一方使用它 属性。这里 veh
.
有关详细信息,请参阅 this