如何使用 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_category 和 code_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") })
我们在数据库中有一个代码,它有一个复合标识符(这里是类别+代码),另一个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_category 和 code_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") })