【发布时间】:2018-06-07 12:53:35
【问题描述】:
我试图理解休眠中两个实体之间的 OneToOne 映射,还有一个条件是主键(以及外键)必须是复合的。
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..
}
具有复合主键 UserID 的 UserInfo 实体是 UserInfo 和 Vehicle 之间 OneToOne 关系的拥有方实体:
@Entity
public class UserInfo {
private String full_name;
@EmbeddedId
UserID userID;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumns({@JoinColumn(name="XYZ_ID") , @JoinColumn(name="ABC_Num")})
Vehicle veh;
// getters, setters and other code
}
当我运行这个程序时,下面是 Hibernate 的 SQL 输出:
Hibernate:如果存在则删除表 UserInfo
休眠:如果存在则删除表车辆
Hibernate: 创建表 UserInfo (ssnID integer not null, uniqueNum integer not null, full_name varchar(255), XYZ_ID integer, ABC_Num integer, primary key (ssnID, uniqueNum))
Hibernate: 创建表 Vehicle(regNum integer not null, vehicleID integer not null, description varchar(255), primary key (regNum, vehicleID))
休眠:更改表 UserInfo 添加约束 FKlbuhulsmr2lghirdvem61b9lb 外键(XYZ_ID,ABC_Num)引用车辆
简而言之,UserInfo 是拥有方实体,并且与 Vehicle 实体(具有复合 VehicleID 作为主键)具有 OneToOne 关系。
我的疑惑就在这里:
在UserInfo 实体中,我们指定OneToOne 关系(和注释):
@OneToOne(cascade=CascadeType.ALL)
@JoinColumns({@JoinColumn(name="XYZ_ID") , @JoinColumn(name="ABC_Num")})
Vehicle veh;
从上面可以看出,在UserInfo 表中,我们在Vehicle 表上有一个复合外键,JoinColumn 的名称指定为XYZ_ID 和ABC_Num。
我的疑问是XYZ_ID 和ABC_Num 对应于Vehicle 表中的哪些字段?
谁能帮我理解这个?
【问题讨论】:
-
我不明白 XYZ_ID 和 ABC_Num 是什么。在我看来,这应该是 vehicleID 和 regNum。为什么在 JoinColumns 中有这些名字?
-
@SimonMartinelli:是的,应该给他们起合理的名字;但是它们会匹配到另一个表中的哪些字段?
-
Hibernate 也会在 UserInfo 表中创建 vehicleID 和 regNum。只需将 JoinColumns 更改为正确的名称。
-
是的,它将在 UserInfo 表中创建那些列,但它们将在另一个表中匹配到哪些列(因为它们充当外键)。这是我的疑问。
标签: hibernate jpa one-to-one composite-primary-key