相关疑难解决方法(0)

使用固定值映射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;
}
Run Code Online (Sandbox Code Playgroud)

一个简单的解决方案是使用EnumType注释和EnumType.ORDINAL:

@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
Run Code Online (Sandbox Code Playgroud)

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

我找到的两个解决方案似乎并不简单......

第一解决方案

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

@Basic
private int intValueForAnEnum;

@PrePersist
void populateDBFields() {
  intValueForAnEnum = …
Run Code Online (Sandbox Code Playgroud)

java orm enums spring jpa

180
推荐指数
6
解决办法
12万
查看次数

如何在JPA中使用枚举

我有一个电影租赁系统的现有数据库.每部电影都有一个评级属性.在SQL中,他们使用约束来限制此属性的允许值.

CONSTRAINT film_rating_check CHECK 
    ((((((((rating)::text = ''::text) OR 
          ((rating)::text = 'G'::text)) OR 
          ((rating)::text = 'PG'::text)) OR 
          ((rating)::text = 'PG-13'::text)) OR 
          ((rating)::text = 'R'::text)) OR 
          ((rating)::text = 'NC-17'::text)))
Run Code Online (Sandbox Code Playgroud)

我认为使用Java枚举将约束映射到对象世界会很好.但由于"PG-13"和"NC-17"中的特殊字符,因此不可能简单地采用允许的值.所以我实现了以下枚举:

public enum Rating {

    UNRATED ( "" ),
    G ( "G" ), 
    PG ( "PG" ),
    PG13 ( "PG-13" ),
    R ( "R" ),
    NC17 ( "NC-17" );

    private String rating;

    private Rating(String rating) {
        this.rating = rating;
    }

    @Override
    public String toString() {
        return rating;
    }
}

@Entity
public class Film …
Run Code Online (Sandbox Code Playgroud)

java enums jpa toplink

35
推荐指数
4
解决办法
7万
查看次数

标签 统计

enums ×2

java ×2

jpa ×2

orm ×1

spring ×1

toplink ×1