2012-02-29 156 views
0

我通常不会发布noob问题,但....自从我开始编程以来,我错过了一些东西。关于“二进制”数据类型

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

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

考虑我将使用此对象与休眠,该属性将在表的列。那么......这个专栏最好的数据类型是什么?

谢谢

+0

见http://stackoverflow.com/questions/135845/are- booleans-as-method-arguments-unacceptable – skaffman 2012-02-29 12:21:05

回答

2

我会建议枚举。

优点:

  • 可以扩展设置变量以后 (应即成为必要)的可能值。
  • 值的名称包含有关值的语义的有价值的意义。
  • 您的编程语言将帮助您进行类型检查。

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

2

我觉得enum是最适合这个目的。

public enum STATE {IN, OUT} 

您总是可以获取等同于保存到数据库的字符串。

1

我会用enum并存储在数据库表转换为String枚举值。 阅读关于Java Enums的文章以获取详细信息。

1

你可以有一个枚举代表方向

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

你可以把它绑定到你的数据库,并与实体中的Hibernate/JPA char列,只需设置具有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; 
    } 
} 
+0

我对此感兴趣:在你的代码中是否隐含了转换?它是否像那样工作? :) – 2012-02-29 16:41:48

+0

数据库不知道枚举,它只是存储一个字符(枚举的内部表示)。但是在你的代码中,实体只暴露枚举而不是内部表示。所以是的,它就是这样 – Alex 2012-02-29 18:14:33

1

使用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>