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

问题描述 投票:0回答:1

我试图理解两个实体之间的OneToOne映射。

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

UserID embeddable type:

@Embeddable
public class UserID  implements Serializable {

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

VehicleID embeddable type:

@Embeddable
public class VehicleID implements Serializable {
    private int vehicleID;
    private int regNum;
    // getters and setters
}

Vehicle Entity having composite primary key VehicleID:

@Entity
public class Vehicle {

    @EmbeddedId
    private VehicleID vehicleID;
    private String description;
    // getters and setters..
}

UserInfo Entity having composite priamary key UserID and is owning-side entity for OneToOne relationship between UserInfo and Vehicle:

@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关系。

My doubt is here:

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的“复合”主键,但它抛出了异常:

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

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

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

hibernate jpa one-to-one
1个回答
1
投票

它应该是这样的:

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

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

有关更多信息,请参阅this

© www.soinside.com 2019 - 2024. All rights reserved.