我有一个名为 job_class 的表,其中包含设置值:
这是表格定义:
create table job_class (
job_class_code int NOT NULL PRIMARY KEY,
job_class_name varchar(50) NOT NULL,
ext_code varchar(10) NOT NULL
)
它总是有3行:
insert into job_class values (1, 'HOURLY', 'H')
insert into job_class values (2, 'SALARY', 'S')
insert into job_class values (3, 'EXECUTIVE', 'E')
job_class 表在员工表中被引用为FK:
create table employee (
employee_id bigint NOT NULL PRIMARY KEY,
first_name varchar(50) NOT NULL,
middle_name varchar(50) NULL,
last_name varchar(50) NOT NULL,
job_class_code int NOT NULL FOREIGN KEY REFERENCES job_class (job_class_code)
)
现在要在域模型(ORM)中映射此表,通常我会这样定义一个类:
public class JobClass implements java.io.Serializable {
private Integer id;
private String name;
private String extCode;
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getExtCode() { return extCode; }
public void setId(String extCode) { this.extCode = extCode; }
}
但如果我将其定义为Enum
,那该怎么办:
public enum JobClass {
HOURLY(1,"HOURLY","H"),
SALARY(2,"SALARY","S"),
EXECUTIVE(3,"EXECUTIVE","E");
private Integer id;
private String name;
private String extCode;
private JobClass(Integer id, String name, String extCode) {
this.id = id;
this.name = name;
this.extCode = extCode;
}
public Integer getId() { return id; }
public String getName() { return name; }
public String getExtCode() { return extCode; }
}
在ORM中使用Enum是否有意义?在此之前我从未在ORM中直接使用过ENUM。在这种情况下这是一个好习惯吗?如果使用Enum,可序列化的含义是什么?
答案 0 :(得分:0)
要使用枚举,您必须100%确定您的表格没有新记录或其现有记录已更改,否则您将收到错误。
使用ORM,您将能够通过@Enumerated注释映射到枚举,有办法:EnumType.ORDINAL或EnumType.STRING。
I'll let you check the documentation for the difference.
在你的情况下,因为你使用自动增加的id作为FK键,所以使用@Enumerated(EnumType.STRING)
是不合适的,因为它会强制你命名你的枚举值1,2和3。
我不想使用@Enumerated(EnumType.ORDINAL)
因为它将您的枚举顺序与数据库表顺序联系起来。但在你的情况下它会起作用。
如果你想加倍,你可以使用转换器@Convert(converter = JobClassConverter.class)
你会保持你的enum原样,而员工的jobClass attribut看起来像那样:
@Column(name = "job_class_code")
@Convert(converter = JobClassConverter.class)
private JobClass jobClass;
然后你将创建JobClassConverter
public class JobClassConverter implements AttributeConverter<JobClass, Integer> {
@Override
public Integer convertToDatabaseColumn(final JobClass pAttribute) {
if (pAttribute == null) {
return null;
} else {
switch (pAttribute) {
case HOURLY:
return 1;
case SALARY:
return 2;
case EXECUTIVE:
return 3;
}
}
}
@Override
public JobClass convertToEntityAttribute(final Integer pDbData) {
if (pDbData == null) {
return null;
} else {
switch (pDbData) {
case 1:
return JobClass.HOURLY;
case 2:
return JobClass.SALARY;
case 3:
return JobClass.EXECUTIVE;
}
}
}
}