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

时间:2017-12-28 13:21:17

标签: hibernate jpa one-to-one

我正在尝试理解两个实体之间的OneToOne映射。

我无法理解如何在mappedBy中指定OneToOne属性以使其成为双向关系。

UserID可嵌入类型:

@Embeddable
public class UserID  implements Serializable {

    private static final long serialVersionUID = 1L;
    private int ssnID;
    private int uniqueNum;
    // getters and setters..
}

VehicleID embeddable类型:

@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实体具有复合priamary密钥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是拥有方实体,与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和{ {1}}。

现在,当我想要使它成为双向关系时,我们需要使用reg_Num属性,这就是我无法理解要引用的属性的地方。

mappedBy

我保留了#34; UserID"因为它是"复合" UserInfo的主键,但它抛出异常:

  

线程中的异常" main" org.hibernate.AnnotationException:未知   mappedBy in:com.example.entity.Vehicle.userInfo,references properties   unknown:com.example.entity.UserInfo.UserID

我无法理解这里提到的财产;我在教程中看到的例子,大多数都有一个PK,FK;但就我而言,它是复合PK,FK。

任何人都可以帮我理解这个吗?

1 个答案:

答案 0 :(得分:1)

应该是这样的:

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

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

有关详细信息,请参阅this