【发布时间】:2018-06-09 01:10:56
【问题描述】:
我正在尝试了解两个实体之间的 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..
}
具有复合主键 UserID 的 UserInfo 实体是 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 表中,我们在Vehicle 表上有一个复合外键,JoinColumn 的名称指定为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 的“复合”主键,但它抛出异常:
线程“主”org.hibernate.AnnotationException 中的异常:未知 mappedBy in:com.example.entity.Vehicle.userInfo,引用的属性 未知:com.example.entity.UserInfo.UserID
我无法理解这里指的是什么属性;我在教程中看到的示例,其中大多数只有一个 PK,FK;但在我的情况下,它是复合 PK,FK。
谁能帮我理解这个?
【问题讨论】:
-
应该是
@OneToOne(mappedBy="veh") -
@HadiJeddizahed:它有效,但你能详细说明一下吗?我还是不明白。
-
mappedBy元素标识关系的反面。在这里,您在Vehicle和UserInfo之间有关系,因此要识别关系的反面,应该通过其他属性使用它。这里veh。抱歉解释不好:(见this -
@HadiJeddizahed 请不要在 cmets 中写答案。您能否将其发布为答案。
标签: hibernate jpa one-to-one