我试图理解两个实体之间的OneToOne映射。
我无法理解如何在mappedBy
中指定OneToOne
属性以使其成为双向关系。
@Embeddable
public class UserID implements Serializable {
private static final long serialVersionUID = 1L;
private int ssnID;
private int uniqueNum;
// getters and setters..
}
@Embeddable
public class VehicleID implements Serializable {
private int vehicleID;
private int regNum;
// getters and setters
}
@Entity
public class Vehicle {
@EmbeddedId
private VehicleID vehicleID;
private String description;
// getters and setters..
}
@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
是拥有方实体,与OneToOne
实体(其具有复合VehicleID作为主键)具有Vehicle
关系。
在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的“复合”主键,但它抛出了异常:
线程“main”中的异常org.hibernate.AnnotationException:未知的mappedBy in:com.example.entity.Vehicle.userInfo,引用的属性unknown:com.example.entity.UserInfo.UserID
我无法理解这里提到的财产;我在教程中看到的例子,大多数都有一个PK,FK;但就我而言,它是复合PK,FK。
任何人都可以帮我理解这个吗?
它应该是这样的:
@OneToOne(mappedBy="veh")
private UserInfo userInfo;
mappedBy
元素标识关系的反面。这里你有Vehicle和UserInfo之间的关系,所以要识别关系的反面应该由其他边属性使用它。这里veh
。
有关更多信息,请参阅this