当相应的表设置了值时,在域模型(ORM)中使用Enum?

时间:2016-05-30 13:59:41

标签: java sql orm enums domain-model

我有一个名为 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,可序列化的含义是什么?

1 个答案:

答案 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;
            }
        }
    }
}