Hibernate从db

时间:2018-04-13 14:22:39

标签: java spring hibernate enums

我有一个Enum类,它有一些值。 我们决定从代码中删除其中一个值及其所有实现。 我们不想删除DB中的任何记录。 我的Enum课程是这样的:

public enum CourseType {

   VIDEO("CourseType.VIDEO"),
   PDF("CourseType.PDF"), 
   QUIZ("CourseType.QUIZ"),      
   SURVEY("CourseType.SURVEY"),
   POWERPOINT("CourseType.POWERPOINT")  //*this one will be removed*
   ...
}

我的课程实体:

@Entity
@Table(name = "CRS")
public class Course {

    @Column(name = "COURSE_TYPE")
    @Enumerated(EnumType.STRING)
    private CourseType courseType;

    @Column(name = "AUTHOR")
    private String author;

    ....

     @Override
    public CourseType getCourseType() {
        return courseType;
    }

    @Override
    public void setCourseType(CourseType courseType) {
        this.courseType = courseType;
    }

    ....
}

从Java Class中删除 Powerpoint 类型并尝试从DB中获取某些值后, 我收到了删除类型的映射错误。

我有这样的代码:

Course course = courseService.get(id);

如果我给了一个类型为' POWERPOINT'在数据库中, 该方法出现以下错误:

  

java.lang.IllegalArgumentException:未知名称值[POWERPOINT]   for enum class [com.tst.enums.CourseType] at   org.hibernate.type.EnumType $ NamedEnumValueMapper.fromName(EnumType.java:461)     在   org.hibernate.type.EnumType $ NamedEnumValueMapper.getValue(EnumType.java:449)     在org.hibernate.type.EnumType.nullSafeGet(EnumType.java:107)at   org.hibernate.type.CustomType.nullSafeGet(CustomType.java:127)at at   org.hibernate.type.AbstractType.hydrate(AbstractType.java:106)at   org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2912)     在org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1673)

当我尝试从DB检索查询结果时有没有办法, 如果记录'那么hibernate将无法获取。 course_type列与代码中的任何枚举值都不匹配? 我是否必须使用某种过滤器?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用注释@filter

@Filter(name = "myFilter", condition = "courseType <> 'CourseType.POWERPOINT'")

并启用它

session.enableFilter("myFilter")

答案 1 :(得分:0)

如果您不能使用过滤器, 类似下面的内容应该有效:

  1. 将POWERPOINT添加回枚举。
  2. 将删除的标志添加到POWERPOINT枚举值。
  3. 加载课程列表后,删除已删除courseType值的课程。
  4. 新课程类型枚举:

    public enum CourseType
    {
        VIDEO("CourseType.VIDEO", false),
        POWERPOINT("CourseType.POWERPOINT", true);
    
        private boolean deletedFlag;
    
        public CourseType(
            existingParameter, // do whatever you are currently doing with this parameter.
            deletedFlagValue)
        {
            // code to handle existing parameter.
    
            deletedFlag = deletedFlagValue;
        }