如何使用Hibernate将枚举映射到单独的表?

时间:2012-08-30 08:50:42

标签: java hibernate enums mapping

我目前有一个Hibernate映射,其工作原理如下:

Table 'TASK':
  id int, name varchar, status varchar

枚举

public enum TaskStatus {
  INVALID, INITIAL, IN_PROGRESS, PAUSED, DONE;
}

类型

@Entity
public class Task {

  @Column(name = "STATUS")
  @Enumerated(EnumType.STRING)
  private TaskStatus status;

  public TaskStatus getStatus() {
      return status;
  }

  public void setStatus(TaskStatus status) {
      this.status = status;
  }
}

我想更改此设置以在一个表中保存所有可能的状态,例如:

Table 'TASK_STATUS':
  id int, status varchar

Table 'TASK':
  id int, name varchar, status_id int foreign key

是否可以使用Hibernate Annotations定义枚举类型的映射,以及将其映射到任务类型的方法。我仍然希望Java实现看起来像上面的那个(具有TaskStatus属性而不是int属性)所以我可以轻松使用:

myTask.setStatus(TaskStatus.DONE);

1 个答案:

答案 0 :(得分:3)

是的,如果status_id的值集与枚举的序数匹配,只需使用以下内容:

@Column(name = "STATUS_ID")
@Enumerated(EnumType.ORDINAL )

Hibernate不会自动生成正确的表结构(FK,TASK_STATUS表)。

如果数值与序数不匹配,则必须创建自定义类型。一个例子是here,但你当然会使用整数类型而不是varchar。