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

标签 java hibernate jpa-2.0 hbm2ddl

数据库中的代码具有复合标识符(此处为类别+代码),另一个表中的代码参数具有相同的两个标识符+参数名称(因此类别+代码+名称)

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

代码.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 表中为派生标识符生成的名称(此处为 code_categorycode_code)?

我需要用“category”代替“code_category”,用“code”代替“code_code”。

我尝试使用 @AssociationOverride 覆盖 @ManyToOne 关联,但找不到任何执行此操作的内容。

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

最佳答案

将此添加到 CodeParam 中的私有(private)代码

@JoinColumns({ 
    @JoinColumn(referencedColumnName = "category", name = "category"),   
    @JoinColumn(referencedColumnName = "code", name = "code") })

关于java - 如何使用 JPA2 在 DDL 中为派生标识符指定生成的列名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32241866/

相关文章:

java - 复制的 Netbeans IDE Maven Web 项目无法编译

hibernate - JPA Criteria API where subclass - 出现错误 : Unable to resolve attribute [lastName] against path [null]

mysql - 有没有办法将对象列表从 MySQL 存储过程返回到 JPA?

java - 在长字符串中查找模式?

java - 如何使用适用于 Java 的 AWS 开发工具包在 Amazon DynamoDB 中使用分页

java - Spring Boot REST API 的指标收集

java - 在表单中修改时,不会返回 JSP 页面中的对象。(数据写入 ID 为 0 的新对象)

java - Hibernate 中的继承。插入示例

java - 我的 H2 表格在哪里?

java - 使用 Tomcat 和 Eclipse IDE 时 Hibernate 和 Jersey 发生冲突