[英]How configure for a (Optional) OneToOne Composite Primary Key?
我正在使用Hibernate,并且有两个表,STUDENTS和DORM_ROOMS,它们与组合键相关:
STUDENTS table:
CAMPUS(String) Part of Composite Key
STUDENT_ID (int) Part of Composite Key
NAME (String)
...
DORM_ROOMS table:
CAMPUS(String) Part of Composite Key
STUDENT_ID (int) Part of Composite Key
ROOM_NUMBER(int)
...
这种关系是一对一的,因为一个学生可以恰好与一个宿舍关联,而一个宿舍与一个学生关联(哇-私人房间!)。 但是,并非所有学生都有宿舍。
我的初始代码(向下精简)如下所示:
FOR STUDENTS:
@Embeddable
public class StudentsPK implements Serializable {
@Column(name = "CAMPUS")
private String Campus;
@Column(name = "STUDENT_ID")
private String StudentID;
...
}
@Entity
@Table(name = "STUDENTS")
public class Students implements Serializable {
@EmbeddedId
private StudentsPK studentsPK;
...
}
FOR DORM_ROOMS:
@Embeddable
public class DormRoomsPK implements Serializable {
@Column(name = "CAMPUS")
private String Campus;
@Column(name = "STUDENT_ID")
private String StudentID;
...
}
@Entity
@Table(name = "DORM_ROOMS")
public class DormRooms implements Serializable {
@EmbeddedId
private DormRoomsPK dormRoomsPK;
...
}
假设数据库模式已经定义和创建。 特别是,CAMPUS + STUDENT_ID是STUDENTS的PK,而CAMPUS + STUDENT_ID是DORM_ROOMS的FK,在该表中用作PK。 此时,我可以成功地将一行插入到STUDENTS中,并将一行插入到DORM_ROOMS中。 即使学生没有宿舍,我也可以从学生中检索任何学生。 但是,我还没有“通知” Hibernate有关两个表之间的关系。 那就是我感到困惑的地方。
我尝试使用“ JOIN”注释“关联”两个表,但是我发现这会导致尝试获取没有宿舍空间的学生返回空结果集的任何尝试。 我想这样做是因为,如果“ JOIN”指出要始终将表视为已联接,那么加入没有宿舍空间且DORM_ROOMS表中没有匹配行的学生将导致结果集为空。
由于使用“ JOIN”注释不起作用,如何修改代码以描述两个表之间的关系,但仍允许我获取没有匹配宿舍的学生?
谢谢。
听起来您正在寻找@OneToOne批注 ,该批注还可以指定该关系是否为可选 。 JBoss JPA 2.1文档中描述了一些示例,这是其中之一。
Example 3: One-to-one association from an embeddable class to another entity.
@Entity
public class Employee {
@Id int id;
@Embedded LocationDetails location;
...
}
@Embeddable
public class LocationDetails {
int officeNumber;
@OneToOne ParkingSpot parkingSpot;
...
}
@Entity
public class ParkingSpot {
@Id int id;
String garage;
@OneToOne(mappedBy="location.parkingSpot") Employee assignedTo;
}
发现了问题! 我发现在具有组合键的@OneToOne关系中,在两个实体中使用单独的FK类来管理组合键会导致错误。 该问题显示在我的原始帖子中,其中定义和使用了StudentsPK和DormRoomsPK! 一旦我更改为使用单个“ PK”类而不是这两个类,我的问题就消除了。 (这似乎没有充分记录的要求!)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.