NutzCN Logo
问答 请问这是否是bug,nutz dao枚举类型转int时不正确
发布于 2654天前 作者 kfirst 4042 次浏览 复制 上一个帖子 下一个帖子
标签: dao bug

我定义了一个包含枚举类型的类,并在枚举类型中添加了 fromInt 静态方法和 value 方法,然后在定义数据表的时候把枚举字段设置为int类型。枚举类型、类定义如下:

public enum UserAction {

    /** 未知动作,用于旧代码兼容新新行为使用 */
    UNKNOWN("未知动作", 0),

    VIEW("查看", 100),

    COLLECT("收藏", 200),

    DELIVER("投递", 300);

    private static final Map<Integer, UserAction> USER_ACTION_MAP = new HashMap<>();

    static {
        for (UserAction userAction : values()) {
            USER_ACTION_MAP.put(userAction.value(), userAction);
        }
    }

    /** 用户行为描述 */
    private String desc;

    /** 用户行为编码以及优先级 */
    private int priority;

    UserAction(String desc, int priority) {
        this.desc = desc;
        this.priority = priority;
    }

    /**
     * 根据用户行为编码,获取用户行为
     * <p />
     * 为了兼容Nutz dao枚举类型转换,该方法必须命名为fromInt
     *
     * @param priority 编码
     * @return 用户行为
     */
    public static UserAction fromInt(int priority) {
        return USER_ACTION_MAP.getOrDefault(priority, UNKNOWN);
    }

    public String getDesc() {
        return desc;
    }

    /**
     * 获取用户行为编码
     * <p />
     * 为了兼容Nutz dao枚举类型转换,该方法必须命名为value
     *
     * @return 用户行为编码
     */
    public int value() {
        return priority;
    }
}
@Table("JobViewer")
public class JobViewer {

    /** 数据库主键 */
    @Id
    private long id;

    /** 职位编号 */
    @Column
    private String jobNumber = "";

    /** 用户ID */
    @Column
    private long userId;

    /** 用户行为,即用户进入该表的原因 */
    @Column
    @ColDefine(type = ColType.INT)
    private UserAction userAction = UserAction.VIEW;

    /** 日志添加的时间 */
    @Column
    private Date addTime = new Date();

    /** 用户分值更新的时间 */
    @Column
    private Date updateTime = new Date();

    public JobViewer() {
    }

    public JobViewer(String jobNumber, long userId, UserAction userAction) {
        this.jobNumber = jobNumber;
        this.userId = userId;
        this.userAction = userAction;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getJobNumber() {
        return jobNumber;
    }

    public void setJobNumber(String jobNumber) {
        this.jobNumber = jobNumber;
    }

    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public UserAction getUserAction() {
        return userAction;
    }

    public void setUserAction(UserAction userAction) {
        // 由于该字段是后添加的,默认值为null,为了避免出现null值,这里使用了一个trick
        if (null == userAction) {
            userAction = UserAction.VIEW;
        }
        this.userAction = userAction;
    }

    public Date getAddTime() {
        return addTime;
    }

    public void setAddTime(Date addTime) {
        this.addTime = addTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}

当我更新数据库数据时,userAction字段可以正确转int值(如100);
当我插入数据库数据时,userAction字段不能正确转换为int值,而是转换为枚举值序号(如1);
另外,在设置Condition和Chain中的userAction值时,也不能正确转换为int值,会变为枚举值序号;

nutz:1.r.62
java version "1.8.0_112"

9 回复

报个issue吧

枚举用字符串不好吗...

不好意思,写错了。不是更新,是读取

当我读取数据库数据时,userAction字段可以正确转为枚举值(如100转为VIEW);
当我插入数据库数据时,userAction字段不能正确转换为int值,而是转换为枚举值序号(如VIEW转为1);

字符串太占空间,数据量比较大(1亿以上)

先报issue吧, 一时没想到怎么fix才对

惭愧,当年太随意了 …

来自美丽的 NutzCN

Enum2Number这个Castor里面,catch下面的代码,
Integer re = src.ordinal();
return (Number) Mirror.me(toType).born(re.toString());
这两句是不是有问题?Mirror.me(toType).born(re.toString())是什么意思?

我测过没问题的

看 javadoc

来自美丽的 NutzCN

添加回复
请先登陆
回到顶部