将JPA中的枚举映射为固定值?

我正在寻找使用JPA映射枚举的不同方法。我特别想设置每个枚举项的整数值,并且只保存整数值。

@Entity

@Table(name = "AUTHORITY_")

public class Authority implements Serializable {

public enum Right {

READ(100), WRITE(200), EDITOR (300);

private int value;

Right(int value) { this.value = value; }

public int getValue() { return value; }

};

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

@Column(name = "AUTHORITY_ID")

private Long id;

// the enum to map :

private Right right;

}

一个简单的解决方案是将枚举注释与EnumType.ORDINAL一起使用:

@Column(name = "RIGHT")

@Enumerated(EnumType.ORDINAL)

private Right right;

但是在这种情况下,JPA映射枚举索引(0,1,2)而不是我想要的值(100,200,300)。

我发现的两个解决方案似乎并不简单…

第一个解决方案

这里提出的解决方案使用@PrePersist和@PostLoad将枚举转换为其他字段,并将枚举字段标记为瞬态:

@Basic

private int intValueForAnEnum;

@PrePersist

void populateDBFields() {

intValueForAnEnum = right.getValue();

}

@PostLoad

void populateTransientFields() {

right = Right.valueOf(intValueForAnEnum);

}

第二解决方案

这里提出的第二个解决方案提出了一个通用的转换对象,但它似乎仍然很繁重且面向hibernate(Java EE中似乎不存在@Type):

@Type(

type = "org.appfuse.tutorial.commons.hibernate.GenericEnumUserType",

parameters = {

@Parameter(

name = "enumClass",

value = "Authority$Right"),

@Parameter(

name = "identifierMethod",

value = "toInt"),

@Parameter(

name = "valueOfMethod",

value = "fromInt")

}

)

还有其他解决方案吗?

我有几个想法,但我不知道它们是否存在于JPA中:

  • 在加载和保存Authority对象时,使用Authority类的正确成员的setter和getter方法
  • 一个等效的想法是告诉JPA,将枚举转换为int并将int转换为enum的Right枚举的方法是什么
  • 因为我使用的是Spring,有什么方法可以告诉JPA使用特定的转换器(RightEditor)?

回答:

对于JPA 2.1之前的版本,JPA仅提供两种方法来按枚举name或按枚举处理枚举ordinal。而且标准的JPA不支持自定义类型。所以:

  • 如果要进行自定义类型转换,则必须使用提供程序扩展(带有Hibernate UserType,EclipseLink Converter等)。(第二个解决方案)。〜或〜
  • 你必须使用@PrePersist@PostLoad技巧(第一个解决方案)。〜或〜
  • 注释gettersetter获取并返回int值〜或〜
  • 在实体级别使用整数属性,并在gettersetter中执行转换。

我将说明最新的选项(这是一个基本实现,请根据需要进行调整):

@Entity

@Table(name = "AUTHORITY_")

public class Authority implements Serializable {

public enum Right {

READ(100), WRITE(200), EDITOR (300);

private int value;

Right(int value) { this.value = value; }

public int getValue() { return value; }

public static Right parse(int id) {

Right right = null; // Default

for (Right item : Right.values()) {

if (item.getValue()==id) {

right = item;

break;

}

}

return right;

}

};

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

@Column(name = "AUTHORITY_ID")

private Long id;

@Column(name = "RIGHT_ID")

private int rightId;

public Right getRight () {

return Right.parse(this.rightId);

}

public void setRight(Right right) {

this.rightId = right.getValue();

}

}

以上是 将JPA中的枚举映射为固定值? 的全部内容, 来源链接: utcz.com/qa/424404.html

回到顶部