代码之家  ›  专栏  ›  技术社区  ›  Yotus

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

  •  0
  • Yotus  · 技术社区  · 9 年前

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

    我们使用@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; }
    }
    

    代码Id.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; }
    }
    

    代码参数.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; }
    }
    

    代码参数.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; }
    }
    

    所以,这非常有效。当我们在内存DB中生成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表(此处 代码_类别 代码_代码 ) ?

    我需要有“category”而不是“code_category”和“code”而非“code_code”。

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

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

    1 回复  |  直到 9 年前
        1
  •  1
  •   sgpalit    9 年前

    将此添加到 私人代码代码 在CodeParam中

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