如何使用 JPA2 在 DDL 中为我的派生标识符指定生成的列名?

How can I specify the generated column name in the DDL for my derived identifier with JPA2?

我们在数据库中有一个代码,它有一个复合标识符(这里是类别+代码),另一个table中的代码参数有相同的两个标识符+一个参数名称(所以类别+代码+名称)

我们使用@IdClass 作为标识符。这是代码:

Code.java

@Entity
@IdClass(CodeId.class)
public class Code implements Serializable {

    @Id
    private String category;

    @Id
    private String code;

    private Date validFrom;
    private Date validUntil;

    public String getCategory() { return category; }
    public String getCode() { return code; }
    public Date getValidFrom() { return validFrom; }
    public Date getValidUntil() { return validUntil; }
}

CodeId.java

public class CodeId implements Serializable {

    private String category;
    private String code;

    public CodeId() {
    }

    public CodeId(String category, String code) {
        this.category = category;
        this.code = code;
    }

    public String getCategory() { return category; }
    public String getCode() { return code; }
}

CodeParam.java

@Entity
@IdClass(CodeParamId.class)
public class CodeParam implements Serializable {

    @Id
    @ManyToOne
    private Code code;

    @Id
    private String name;

    private String value;

    public Code getCode() { return code; }
    public String getName() { return name; }
    public String getValue() { return value; }
}

CodeParamId.java

public class CodeParamId implements Serializable {

    private CodeId code;
    private String name;

    public CodeParamId() {
    }

    public CodeParamId(CodeId code, String name) {
        this.code = code;
        this.name = name;
    }

    public CodeId getCode() { return code; }
    public String getName() { return name; }
}

所以,这个效果很好。我们遇到的问题是我们的单元测试,当我们生成 HSQLDB 内存数据库并使用实体创建模式时,使用 hbm2ddl。这是生成的 DDL:

create table Code (
    category varchar(255) not null,
    code varchar(255) not null,
    validFrom timestamp,
    validUntil timestamp,
    primary key (category, code)
)

create table CodeParam (
    name varchar(255) not null,
    code_category varchar(255),
    code_code varchar(255) not null,
    primary key (code_category, code_code, name)
)

alter table CodeParam 
    add constraint FK_mvkuf50rko4mipw1sb7r9yidk 
    foreign key (code_category, code_code) 
    references Code

如何更改在 CodeParam table 中为派生标识符生成的名称(此处为 code_categorycode_code) ?

我需要 "category" 而不是 "code_category" 和 "code" 而不是 "code_code"。

我尝试使用@AssociationOverride 覆盖@ManyToOne 关联,但找不到这样做的任何东西。

我还假设使用 @EmbeddedId 等会更容易,但我需要知道是否可以通过这种方式使用 @IdClass。

将此添加到 CodeParam

中的 private Code code
@JoinColumns({ 
    @JoinColumn(referencedColumnName = "category", name = "category"),   
    @JoinColumn(referencedColumnName = "code", name = "code") })