【问题标题】:Hibernate fetching deleted java enum types from dbHibernate 从数据库中获取已删除的 Java 枚举类型
【发布时间】:2018-04-13 14:22:39
【问题描述】:

我有一个 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 类中删除 Powerpoint 类型并尝试从数据库中获取一些值之后, 我收到已删除类型的映射错误。

我有这样的代码:

Course course = courseService.get(id);

如果我在数据库中提供了一个其类型为“POWERPOINT”的课程 ID, 该方法得到以下错误:

java.lang.IllegalArgumentException:未知名称值 [POWERPOINT] 枚举类 [com.tst.enums.CourseType] 在 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) 在 org.hibernate.type.CustomType.nullSafeGet(CustomType.java:127) 在 org.hibernate.type.AbstractType.hydrate(AbstractType.java:106) 在 org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2912) 在 org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1673)

当我尝试从数据库中检索查询结果时,有什么办法吗? 如果该记录的 course_type 列与代码中的任何枚举值不匹配,休眠将不会获取? 我必须使用某种过滤器吗?

【问题讨论】:

  • 因此,在您的选择查询中,您应该排除具有已删除 enum 值的行。
  • 谢谢,但是'courseService.get(id);'不是查询,而是通用方法。此外,我不想在代码中到处写排除行代码。
  • 如果您想排除 ENUM,您可能必须编写自己的查询。毕竟,枚举是为了让一个值必须与枚举中的内容相匹配。
  • 那么在这种情况下,您希望courseType 属性具有什么值do?您的问题有点令人困惑,因为您首先提到调用get,然后您谈论“查询结果”,然后在 cmets 中您说这不是查询,而是get。如果您不希望 get 方法返回特定行,则应将其从表中删除。目前尚不清楚您为什么不想这样做。
  • @Codeer 你没有在这里澄清任何混淆,你正在添加它。 OP 在他的问题中声称有查询结果,但随后在他的评论中说这不是查询。 OP 应该澄清他们想要什么以及为什么他们不想要最明显的解决方案(从数据库中删除具有不再存在的类型课程的记录(如果需要,将它们归档到某个地方))

标签: java spring hibernate enums


【解决方案1】:

你可以尝试使用注解@filter

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

并启用它

session.enableFilter("myFilter")

【讨论】:

    【解决方案2】:

    如果您不能使用过滤器, 类似以下的东西应该可以工作:

    1. 将 POWERPOINT 添加回枚举中。
    2. 将已删除标志添加到 POWERPOINT 枚举值。
    3. 加载课程列表后,删除具有已删除 courseType 值的课程。

    新的 CourseType 枚举:

    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;
        }
    

    【讨论】:

      猜你喜欢
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      相关资源
      最近更新 更多