【问题标题】:about "binary" datatypes关于“二进制”数据类型
【发布时间】:2012-03-18 22:11:31
【问题描述】:

我通常不发布菜鸟问题,但是....自从我开始编程以来,我错过了一些东西。

让我们想象一个 pojo 实体对象,有几个属性名称、描述等。其中之一是“方向”,只能是“输入”或“输出”。

该属性的最佳数据类型是什么? 我可以使用布尔值,例如假设真为输入,假为输出。或者,也许我可以使用单个字符 'I' 和 'o',或者一个“枚举”..

考虑我将这个对象与hibernate一起使用,该属性将放在一个表的列上。那么...该列的最佳数据类型是什么?

谢谢

【问题讨论】:

标签: java


【解决方案1】:

我建议枚举。

优点:

  • 您可以稍后扩展变量的可能值集 (如果有必要的话)。
  • 值的名称包含有关值语义的有价值的含义。
  • 您的编程语言将帮助您进行类型检查。

当然,这意味着您应该为枚举值使用描述性名称...

【讨论】:

    【解决方案2】:

    我认为enum 最适合此目的。

    public enum STATE {IN, OUT}
    

    你总是可以得到等价的字符串来保存到数据库。

    【讨论】:

      【解决方案3】:

      我将使用enum 并将转换为String 的枚举值存储在数据库表中。 阅读Java Enums上的文章了解详情。

      【讨论】:

        【解决方案4】:

        你可以有一个枚举来表示方向

        public enum Direction {
            IN('i'), OUT('o');
        
            final char dir;
            Direction(char dir) {
                this.dir = dir;
            }
        
            public static Direction find(char c) {
                for (Direction d : Direction.values()) {
                    if (d.dir == c)
                        return d;
                }
                throw new IllegalArgumentException("Not found: " + c);
            }
        }
        

        您可以将它绑定到您的数据库中的一个 char 列,并在您的实体中使用 Hibernate/JPA,只需将您的列设置为 char 类型,并使用 getter/setter 仅公开您的枚举。

        @Entity
        public class MyEntity {
            @Column
            private char direction;
        
            public Direction getDirection() {
                return Direction.find(direction);
            }
        
            public void setDirection(Direction dir) {
                this.direction = dir.dir;
            }
        }
        

        【讨论】:

        • 我对此感兴趣:在您的代码中,转换是隐式的吗?它只是那样工作吗? :)
        • 数据库不知道枚举,它只是存储一个字符(枚举的内部表示)。但是在您的代码中,实体只公开枚举而不是内部表示。所以是的,它就是这样工作的
        【解决方案5】:

        使用enum。对于 Hibernate,您可以使用以下映射,它会自动使用枚举值的名称从数据库中存储/检索:

                <type name="org.hibernate.type.EnumType">
                    <param name="enumClass">foo.MyEnum</param>
                    <!-- 12 == java.sql.Types.VARCHAR -->
                    <param name="type">12</param>
                </type>
        

        【讨论】:

          猜你喜欢
          • 2014-11-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-14
          • 2021-06-13
          • 1970-01-01
          • 2015-11-19
          • 1970-01-01
          相关资源
          最近更新 更多