Hibernate:为复合 PK、FK 的 mappedBy 属性指定正确的值

Hibernate: Specifying correct value for mappedBy attribute for composite PK, FK

我想了解两个实体之间的 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..
}

UserInfo 实体具有复合主键 UserID,并且是 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 table 中,我们在 Vehicle table 上有一个复合外键,[=25= 的名称] 指定为 vehicle_IDreg_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 的 "composite" 主键,但它抛出异常:

Exception in thread "main" org.hibernate.AnnotationException: Unknown mappedBy in: com.example.entity.Vehicle.userInfo, referenced property unknown: com.example.entity.UserInfo.UserID

我不明白 属性 在这里指的是什么;我在教程中看到的示例,它们中的大多数只有一个 PK,FK;但就我而言,它是复合 PK,FK。

谁能帮我理解一下?

应该是这样的:

@OneToOne(mappedBy="veh")
private UserInfo userInfo;

mappedBy 元素标识关系的反面。这里你有 Vehicle 和 UserInfo 之间的关系,所以要识别关系的反面应该由另一方使用它 属性。这里 veh.

有关详细信息,请参阅 this