如何在复合主键中使用外键?

mem*_*und 4 java postgresql hibernate

我想创建一个composite primary keywith hibernate. 通常我会去 @IdClass

但这次我想使用一个foreign key也在复合主键里面。

问题:这可能吗?

例子:

@Entity
class Person {
    long id;
}

class CarPK implements Serializable {
    private int code;
    private String name;

    public CarPK(int code, String name) {
        this.code = code;
        this.name = name;
    }
}

@Entity
@IdClass(CarPK.class)
class Car {
    @Id
    private int code;

    @Id
    private String name;

    //can I also mark "person.id" with @Id?
    @ManyToOne
    @JoinColumn(name = "fk_person_id", foreignKey = @ForeignKey(name = "fk_person"))
    private Person person; //assume car is shared
}
Run Code Online (Sandbox Code Playgroud)

人员参考将在数据库中显示为fk_person_id。是否也可以将此列添加到primary key表中car

所以我会变得类似于:CONSTRAINT car_pkey PRIMARY KEY (code, name, fk_person_id)


更新:

@ManyToOne
@JoinColumn(name = "id")
private Person person;
Run Code Online (Sandbox Code Playgroud)

结果是:Property of @IdClass not found in entity path.to$Car: id

ftr*_*ftr 7

是的,您可以将 添加@Id到联接列,但您必须使用IdClass. 我在当前的项目中正在做完全相同的事情。


@Entity
@IdClass(MyIdClass.class)
public class MyObject {

    @Id
    private String key;

    @Column
    @Lob
    private String value;

    @ManyToOne(cascade = CascadeType.PERSIST)
    @Id
    @JoinColumn(name = "id")
    private MyOtherObject otherObject;
...
Run Code Online (Sandbox Code Playgroud)


public class MyIdClass implements Serializable {

    private long otherObject;
    private String key;

...
Run Code Online (Sandbox Code Playgroud)

MyOtherObject.idlong在这种情况下是 a 。