【问题标题】:How to use a foreign key within a composite primary key?如何在复合主键中使用外键?
【发布时间】:2015-12-01 11:44:17
【问题描述】:

我想用hibernate 创建一个composite primary key。通常我会选择@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
}

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

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


更新:

@ManyToOne
@JoinColumn(name = "id")
private Person person;

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

【问题讨论】:

    标签: java hibernate postgresql


    【解决方案1】:

    是的,您可以将@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;
    ...
    

    
    public class MyIdClass implements Serializable {
    
        private long otherObject;
        private String key;
    
    ...
    

    MyOtherObject.id 在这种情况下是 long

    【讨论】:

    • 我按照建议尝试了,但它不起作用。请查看我的更新。
    • 您是否在 Join 列中添加了 @Id?
    猜你喜欢
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2015-01-09
    • 2018-07-29
    • 2022-11-21
    • 2012-05-20
    相关资源
    最近更新 更多