`
zyeming
  • 浏览: 18001 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用Hibernate映射INT字段到EnumSet

阅读更多
上次提到了把数据库的INT字段映射到Java里的Enum,但这样的字段只表示保存一个值。以前用C时经常会写这样的代码:

const int TYPE_1 = 1;
const int TYPE_2 = 2;
const int TYPE_3 = 4;

int type = TYPE_1 | TYPE_3;

if (type & (TYPE_1 | TYPE_3)) {
   ...
}


这样我可以在type变量里保存多个boolean类型的option。在Java里面类似的功能可以通过EnumSet实现,但是我还是希望在数据库里只用一个INT字段就可以保存整个EnumSet,自然还是通过自定义一个UserType来实现。

以上一篇文章里的IntegerValuedEnumType基础,再增加两个方法,encode用来把EnumSet转换为Integer,decode用来把Integer解码为EnumSet。其他只需要稍加修改即可。

/*
 * Encode the EnumSet into an integer based on bit on/off
 */
private int encode(EnumSet<T> set) {
    int ret = 0;
    for (T val : set) {
        ret |= 1 << val.getCode();
    }
    return ret;
}

/*
 * Decode the integer back to a EnumSet based on bit on/off
 */
private EnumSet<T> decode(int code) {
	Map<Integer, T> codeMap = new HashMap<Integer, T>();
	for (T val : EnumSet.allOf(enumClass)) {
		codeMap.put(val.getCode(), val);
	}
	  
    EnumSet<T> result = EnumSet.noneOf(enumClass);
    while (code != 0) {
        int ordinal = Integer.numberOfTrailingZeros(code);
        code ^= Integer.lowestOneBit(code);
        result.add(codeMap.get(ordinal));
    }
    return result;
}


相关文章:
用Hibernate映射INT字段到枚举类型:http://voidtech.iteye.com/blog/641347
0
0
分享到:
评论

相关推荐

    阅读EnumSet抽象类

    在EnumSet抽象类中,还定义了一个抽象方法addAll,该方法用于将所有枚举类型元素添加到EnumSet对象中。 EnumSet抽象类的子类包括RegularEnumSet和JumboEnumSet。RegularEnumSet是EnumSet抽象类的默认实现,而...

    java集合-EnumSet的使用

    EnumSet 是 Java 中用于存储枚举类型元素的集合类。它是 AbstractSet 的子类,并专门为枚举类型设计,提供了高效的实现。 下面是关于 EnumSet 的一些重要信息: 存储枚举元素:EnumSet 只能存储同一个枚举类型的...

    Java中EnumSet代替位域代码详解

    在Java编程中,有时我们需要表示一组特定状态或...在大多数情况下,我们应优先考虑使用`EnumSet`,除非在特定场景下需要位域来构建通信协议字段。在实际开发中,理解并善用`EnumSet`能够提升代码质量,降低维护成本。

    说说Java中的枚举 转 可以了,够了 包括EnumSet(Map)

    这篇博客将深入探讨Java枚举的特性和使用方法,包括`EnumSet`和`EnumMap`这两个与枚举相关的数据结构。 首先,枚举定义的基本语法是`public enum EnumName {constant1, constant2, ...}`。每个枚举常量都是`...

    Options:有时在某些情况下,您想在OptionSet中使用Enum或希望Enum由Raw的Int类型支持,但同时也具有String标签

    目录介绍特征安装用法设置一个MappedValueRepresentable枚举使用MappedValueCollectionRepresented 使用MappedEnum类型的可编码枚举在ESet中使用OptionSet中的EnumSet 将EnumSet转换为Enum数组使用...

    2021年EFFECTIVEJAVA读书笔记.docx

    本文总结了Effective Java 中关于枚举与注解的知识点,涵盖了枚举类型的优点、使用指南、避免使用 int 常量、使用 EnumSet 和 EnumMap 等。 枚举类型的优点 枚举类型提供了编译时类型安全、自动命名空间隔离、可以...

    一文弄懂EnumMap和EnumSet

    在Java编程中,当我们需要处理特定枚举类型(Enum)作为键(Key)的映射关系时,EnumMap和EnumSet成为两种非常实用的工具类。它们是Java集合框架中专门为枚举类型设计的高效容器,提供了比普通HashMap和HashSet更好...

    Java EnumSet工作原理初窥

     首先以事实说话,存在这样一个EnumSet,它有50个枚举值T0~T49,将50个值插入到容器(HashSet、EnumSet)中,为一个操作,将50个枚举值移出做为第二个操作。把第一个和第二个操作执行的总时间设定为一个周期,拿...

    java枚举类型enum的使用

    ##### 4.2 EnumSet 使用示例 `EnumSet` 是一个专为枚举类型设计的集合类,用于存储枚举类型的元素。它提供了一些特殊的方法,使得操作枚举元素更加高效: ```java public static void testEnumSet() { EnumSet...

    Effective java 3 学习记录.docx

    Effective Java 3 学习记录 本学习记录主要介绍了 Effective Java 3 中的静态工厂方法和 ...Builder 类中有必填字段和选填字段,使用者可以根据需要选择性地设置字段值。最后,使用 build() 方法来构建 Fruit 对象。

    enum枚举类的一些代码demo

    `EnumSet`是一个高效的集合,用于存储枚举类型,而`EnumMap`则是一个键为枚举类型的高效映射表: ```java EnumSet&lt;WeekDay&gt; weekendDays = EnumSet.of(WeekDay.SATURDAY, WeekDay.SUNDAY); for (WeekDay day : ...

    Java期末复习——枚举与反射机制

    `EnumMap`是一个映射,其中的键是枚举类型,而`EnumSet`则是一个高效、不可变的集合,只包含枚举类型中的元素。 二、反射机制 反射机制允许在运行时检查类的信息,包括类的结构、字段、方法等,并动态创建和访问...

    java枚举ppt和详细代码

    2. **用普通类模拟枚举**: 在早期的Java版本中,没有枚举类型,开发者通常会使用静态常量来模拟枚举的功能。例如: ```java public class Color { public static final Color RED = new Color(); public ...

    enumset-用于创建紧凑的枚举集的库-Rust开发

    enumset一个用于定义可在紧凑位集中使用的枚举的库。 它支持最多128个变量的枚举,并具有在枚举中使用这些集合的宏。用于定义可在紧凑位集中使用的枚举的库。 它支持最多128个变量的枚举,并具有一个宏以在常量中...

    Java—Set集合详解(HashSet/LinkedHashSet/TreeSet/EnumSet)

    当这些类的实例添加到HashSet中时,ClassA的实例由于哈希码不同而存储在不同位置,ClassB的实例由于`equals()`返回不同的对象地址而形成链表,而ClassC的实例则被视为同一对象。 **LinkedHashSet类** 是另一种Set...

    java api 操作手册

    - Java 8引入的新特性,简化了函数式编程,如 `(int a, int b) -&gt; a + b` 表示一个加法函数。 8. **Stream API**: - 提供了一种新的处理数据的方式,支持并行和顺序流操作,例如过滤、映射、归约等。 9. **日期...

    高级编程-java实验报告.docx

    实验报告主要涵盖了Java编程中的高级主题,特别是关于集合框架、映射和枚举类型的应用。以下是对这些知识点的详细说明: 1. **Java集合框架**: - **ArrayList**: 是基于数组实现的列表,提供了随机访问元素的能力...

    数据库开发规范

    6. **避免使用ENUM或者禁止使用ENUMSET类型字段** - **解释**:ENUM类型虽然可以简化数据输入,但其灵活性较低,不建议在业务场景中使用。 7. **尽可能把所有列定义为NOT NULL** - **解释**:NULL值可能会导致...

    Java枚举类型enum的详解及使用

    例如,我们可以使用 EnumMap 来保存枚举类型的映射关系: ```java EnumMap, String&gt; map = new EnumMap(Light.class); map.put(Light.RED, "红灯"); map.put(Light.GREEN, "绿灯"); map.put(Light.YELLOW, "黄灯"); ...

    2012RobocupRuscue东大代码

    import java.util.EnumSet; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; import rescuecore2.Constants; import rescuecore2.config.Config; import ...

Global site tag (gtag.js) - Google Analytics