关于“二进制”数据类型
我通常不会发布noob问题,但....自从我开始编程以来,我错过了一些东西。关于“二进制”数据类型
让我们来想象一个pojo实体对象,它有几个属性名称,描述等等。其中之一是“方向”,只能是“IN”或OUT。
该属性的最佳数据类型是什么? 我可以使用布尔值,例如假设为true,如false,如出。或者,也许我可以使用单个字符“I”和“o”或“枚举”。
考虑我将使用此对象与休眠,该属性将在表的列。那么......这个专栏最好的数据类型是什么?
谢谢
我会建议枚举。
优点:
- 可以扩展设置变量以后 (应即成为必要)的可能值。
- 值的名称包含有关值的语义的有价值的意义。
- 您的编程语言将帮助您进行类型检查。
当然,这意味着你应该使用描述性的名称为您的枚举值...
我觉得enum
是最适合这个目的。
public enum STATE {IN, OUT}
您总是可以获取等同于保存到数据库的字符串。
你可以有一个枚举代表方向
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;
}
}
我对此感兴趣:在你的代码中是否隐含了转换?它是否像那样工作? :) – 2012-02-29 16:41:48
数据库不知道枚举,它只是存储一个字符(枚举的内部表示)。但是在你的代码中,实体只暴露枚举而不是内部表示。所以是的,它就是这样 – Alex 2012-02-29 18:14:33
使用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>
见http://stackoverflow.com/questions/135845/are- booleans-as-method-arguments-unacceptable – skaffman 2012-02-29 12:21:05