Hibernate:复合主键 - 外键:如何在两个表之间映射单个字段

时间:2017-12-26 19:02:47

标签: hibernate jpa one-to-one composite-primary-key

我试图理解hibernate中两个实体之间的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="XYZ_ID") , @JoinColumn(name="ABC_Num")})
    Vehicle veh;

    // getters, setters and other code
}

当我运行这个程序时,下面是Hibernate的SQL输出:

  

Hibernate:drop table UserInfo if exists

     

Hibernate:drop table Vehicle if exists

     

Hibernate:create table UserInfo(ssnID integer not null,uniqueNum integer not null,full_name varchar(255),XYZ_ID integer,ABC_Num integer,primary key(ssnID,uniqueNum))

     

Hibernate:create table Vehicle(regNum integer not null,vehicleID integer not null,description varchar(255),primary key(regNum,vehicleID))

     

Hibernate:alter table UserInfo添加约束FKlbuhulsmr2lghirdvem61b9lb外键(XYZ_ID,ABC_Num)引用Vehicle

简而言之,UserInfo是拥有方实体,与OneToOne实体(具有复合VehicleID作为主键)具有Vehicle关系。

我怀疑在这里:

UserInfo实体中,我们指定OneToOne关系(和注释):

@OneToOne(cascade=CascadeType.ALL)
@JoinColumns({@JoinColumn(name="XYZ_ID") , @JoinColumn(name="ABC_Num")})
Vehicle veh;

从上面可以看出,在UserInfo表中,我们在Vehicle表上有一个复合外键,JoinColumn的名称指定为XYZ_ID和{ {1}}。

我怀疑ABC_NumXYZ_ID对应ABC_Num表中哪些字段?

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

1 个答案:

答案 0 :(得分:1)

到Vehical主键(ssnID,uniqueNum)