【问题标题】:Hibernate: Specifying correct value for mappedBy attribute for composite PK, FKHibernate:为复合 PK、FK 的 mappedBy 属性指定正确的值
【发布时间】: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_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 的“复合”主键,但它抛出异常:

线程“主”org.hibernate.AnnotationException 中的异常:未知 mappedBy in:com.example.entity.Vehicle.userInfo,引用的属性 未知:com.example.entity.UserInfo.UserID

我无法理解这里指的是什么属性;我在教程中看到的示例,其中大多数只有一个 PK,FK;但在我的情况下,它是复合 PK,FK。

谁能帮我理解这个?

【问题讨论】:

  • 应该是@OneToOne(mappedBy="veh")
  • @HadiJeddizahed:它有效,但你能详细说明一下吗?我还是不明白。
  • mappedBy 元素标识关系的反面。在这里,您在 VehicleUserInfo 之间有关系,因此要识别关系的反面,应该通过其他属性使用它。这里veh。抱歉解释不好:(见this
  • @HadiJeddizahed 请不要在 cmets 中写答案。您能否将其发布为答案。

标签: hibernate jpa one-to-one


【解决方案1】:

应该是这样的:

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

mappedBy 元素标识关系的反面。在这里,您有 Vehicle 和 UserInfo 之间的关系,因此要识别关系的反面,应该通过其他侧属性使用它。这里veh

欲了解更多信息,请参阅this

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    相关资源
    最近更新 更多