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

标签 java hibernate postgresql

我想使用 hibernate 创建一个复合主键。通常我会选择@IdClass

但是这次我想在复合主键中也使用外键

问题:这可能吗?

示例:

@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 表的 主键 中?

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

<小时/>

更新:

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

结果:在实体path.to$Car: id中找不到@IdClass的属性

最佳答案

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

关于java - 如何在复合主键中使用外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34019617/

相关文章:

Java 日历日期检查

java - 使用 jenkins 运行 selenium 测试用例时出错

python - Mac 10.6.8 上的 postgres 安装错误

hibernate - 是否可以插入新的@Immutable实体

java - JPA - 无效的 persistence.xml

postgresql - 如何将字符串视为 UTC 时间戳?

sql - PostgreSQL 中 varchar 列的索引长度

java - 空格拆分问题,java

java - 如何提取pdf文件中表格的内容?

hibernate - 按(链接)列排序,该列可以为空