我使用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是学生的PK,CAMPUS+STUDENT_ID是DORM_ROOMS的FK,用作该表中的PK。此时,我可以成功地将一行插入到STUDENTS中,并将一行插入到DORM_ROOMS中。我还可以从学生中检索任何学生,即使该学生没有宿舍。但是,我还没有“通知”Hibernate这两个表之间的关系。这就是我困惑的地方。
我试图通过使用"JOIN“注释来”关联“这两个表,但我发现这会导致任何试图获取没有宿舍的学生返回空结果集的尝试。我想这是因为如果"JOIN“声明表总是被视为已连接的,那么连接一个没有宿舍的学生,并且在DORM_ROOMS表中没有匹配的行将导致一个空的结果集。
由于使用"JOIN“注释不起作用,我如何修改代码来描述两个表之间的关系,同时仍然允许我获取没有匹配宿舍的学生?
谢谢。
发布于 2014-09-15 03:11:42
这听起来像是您在寻找@OneToOne annotation,它也能够指定关系是否为optional。JBoss JPA 2.1 docs中描述了一些示例,这里就是其中之一。
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;
}发布于 2014-09-16 07:05:02
找到问题了!我发现在@OneToOne与组合键的关系中,使用单独的FK类来管理两个实体中的组合键会导致错误。这个问题在我最初定义和使用StudentsPK和DormRoomsPK的帖子中显示出来了!一旦我改用一个"PK“类而不是这两个类,我的问题就解决了。(这似乎不是一个有良好文档记录的要求!)
https://stackoverflow.com/questions/25836688
复制相似问题