java - 使用 JPA 2.1 将 EnumSet 映射到 mysql Set

标签 java mysql jpa

我正在寻找将 EnumSet 存储在类型为 set 的 mysql 列中的方法:

@Data
@Entity
@Table(name = "ENTITY_TABLE")
public class Entity implements Serializable {

  @Id
  @GeneratedValue
  @Column(nullable = false)
  @NotNull
  private String id;

  @Column(name = "types")
  private EnumSet<Type> types;

}

枚举类型定义如下:

public enum Type {
  TYPE1,
  TYPE2,
  TYPE3,
  TYPE4,
  TYPE5
}

表格定义如下:

CREATE TABLE `ENTITY_TABLE` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `types` set('TYPE1','TYPE2','TYPE3','TYPE4','TYPE5') DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

并插入表中:

INSERT INTO ENTITY_TABLE (types) VALUE ( 'TYPE1','TYPE2')

SET in mysql docs

最佳答案

非常感谢!我不得不使用与您在这里使用的版本略有不同的版本。对我有用的是:

我有一个需要调整的权限枚举:

@Convert(converter = SetConverter.class)
@Column(name = "permission")
private EnumSet<Permission> permission;


//in a util and imported
...
@Converter
public static class SetConverter implements AttributeConverter<EnumSet<Permission>, String> {

    public String convertToDatabaseColumn(EnumSet<Permission> attribute) {
        StringBuilder sb = new StringBuilder();
        for (Permission c : attribute) { 
            sb.append(c + ",");
        }
        return sb.toString();
    }

    public EnumSet<Permission> convertToEntityAttribute(String dbData) {
        if (dbData == null) {
            dbData = "";
        }
        EnumSet<Permission> perm = EnumSet.of(Permission.DEFAULT); //default was a value I added.
        String[] persistencePermissions = StringUtils.trimAllWhitespace(dbData).toUpperCase().split(",");
        if (!StringUtils.isEmpty(StringUtils.trimAllWhitespace(dbData))) {
        try {
            for (String str : persistencePermissions) { 
            perm.add(Permission.valueOf(str));
        }}  
        catch (IllegalArgumentException IAE) {
            throw new Exception("INVALID_REQUEST");
        }}

        return perm;

    }

}

关于java - 使用 JPA 2.1 将 EnumSet 映射到 mysql Set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42136578/

相关文章:

java - 在java中使用sparql查询检索对象属性范围内的多个类(Protege 3.4.8)

java - PC 故障后我的 MainActivity 文件是否损坏?

java - 如何强制 Apache Tomcat 不重用线程池中的线程?

mysql - 构建一个计算相似条目的数据库

java - 我可以查询 Spring JPA @Query 来查找列表与另一个列表的任何匹配项吗?

java - scala.concurrent.forkjoin.ForkJoinPool 与 java.util.concurrent.ForkJoinPool

python - MariaDB、Python read_sql_table、utf8-bin

php - 发票平面 : List Payment Transaction on Invoice

java - 无主键和一般用途的 JPA 数字生成器

java - 如何测试持久层?