首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MyBatis将属性映射到错误的Enum

MyBatis将属性映射到错误的Enum
EN

Stack Overflow用户
提问于 2017-06-09 06:38:20
回答 2查看 3.6K关注 0票数 4

我的域类有映射到枚举的属性。奇怪的是,MyBatis 3.4.x ( 3.4.0和3.4.4 )。这适用于3.3.x)和Spring MyBatis 1.3.1,尝试用一个不相关的枚举映射它,并给出错误。

org.apache.ibatis.executor.result.ResultMapException: org.mybatis.spring.MyBatisSystemException:嵌套异常是试图从结果集获取列“order_line_programmed”的org.mybatis.spring.MyBatisSystemException错误。原因: java.lang.IllegalArgumentException:无枚举常量foo.UnrelatedEnum.yes

我的域类如下所示:

代码语言:javascript
复制
public class OrderLine {

    private Long id;
    private Product product;
    private ProgrammedStatus programmedStatus;
    private String programmedFeedback;
    private boolean completed = false;
}

ProgrammedStatus是一个简单的枚举

代码语言:javascript
复制
public enum ProgrammedStatus {
    yes, no, error;
}

这个programmedStatus被映射到程序列,如下所示,

代码语言:javascript
复制
<resultMap id="orderLineResult" type="foo.OrderLine">
    <id property="id" column="technical_order_line_id" />
    <result property="programmedStatus" column="order_line_programmed" typeHandler="org.apache.ibatis.type.EnumTypeHandler" />
    <result property="programmedFeedback" column="order_line_programmed_feedback" />
    <result property="completed" column="order_line_completed"
        javaType="java.lang.Boolean" typeHandler="org.apache.ibatis.type.BooleanTypeHandler" />
    <association property="product"
        notNullColumn="order_line_product_id"
        resultMap="foo.repository.mapper.ProductMapper.productResult" />
</resultMap>

我甚至尝试将javaType映射到typeHandler,但是MyBatis似乎忽略了它。

很少有有用的信息,

  • UnrelatedEnum也是一个简单的Enum,如ProgrammedStatus
  • 产品有一个属性,该属性的类型为UnrelatedEnum。

我在代码的其他地方也发现了这个问题。我可以在这里拥有自己的特定typeHandler,而不是EnumTypeHandler。问题是,这种枚举匹配在我的程序中的许多地方使用,迁移wit 3.4会使我的程序不稳定。

EN

回答 2

Stack Overflow用户

发布于 2018-01-09 14:13:27

删除显式提到的enum typeHandler为我工作。

删除: typeHandler="org.apache.ibatis.type.EnumTypeHandler“

代码语言:javascript
复制
<resultMap id="orderLineResult" type="foo.OrderLine">
    <id property="id" column="technical_order_line_id" />
    <result property="programmedStatus" column="order_line_programmed" />
    <result property="programmedFeedback" column="order_line_programmed_feedback" />
    <result property="completed" column="order_line_completed"
        javaType="java.lang.Boolean" typeHandler="org.apache.ibatis.type.BooleanTypeHandler" />
    <association property="product"
        notNullColumn="order_line_product_id"
        resultMap="foo.repository.mapper.ProductMapper.productResult" />
</resultMap>
票数 5
EN

Stack Overflow用户

发布于 2022-10-28 14:44:45

正如这里所解释的,不应该将https://github.com/mybatis/mybatis-3/issues/995 - EnumTypeHandler显式指定为枚举属性的类型处理程序,因为(作为类型处理程序)它将在所有其他显式指定的映射中被缓存和重新使用(这将导致原始问题)。为了避免这种情况,让MyBatis找出枚举属性的类型处理程序。如果您的枚举是“特殊的”,您可以子类EnumTypeHandler并在需要的地方显式引用它,但是缓存是可以的,因为每次它都处理完全相同的枚举类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44450930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档