我通常不會發布noob問題,但....自從我開始編程以來,我錯過了一些東西。關於「二進制」數據類型
讓我們來想象一個pojo實體對象,它有幾個屬性名稱,描述等等。其中之一是「方向」,只能是「IN」或OUT。
該屬性的最佳數據類型是什麼? 我可以使用布爾值,例如假設爲true,如false,如出。或者,也許我可以使用單個字符「I」和「o」或「枚舉」。
考慮我將使用此對象與休眠,該屬性將在表的列。那麼......這個專欄最好的數據類型是什麼?
謝謝
我通常不會發布noob問題,但....自從我開始編程以來,我錯過了一些東西。關於「二進制」數據類型
讓我們來想象一個pojo實體對象,它有幾個屬性名稱,描述等等。其中之一是「方向」,只能是「IN」或OUT。
該屬性的最佳數據類型是什麼? 我可以使用布爾值,例如假設爲true,如false,如出。或者,也許我可以使用單個字符「I」和「o」或「枚舉」。
考慮我將使用此對象與休眠,該屬性將在表的列。那麼......這個專欄最好的數據類型是什麼?
謝謝
我會建議枚舉。
優點:
當然,這意味着你應該使用描述性的名稱爲您的枚舉值...
我覺得enum
是最適合這個目的。
public enum STATE {IN, OUT}
您總是可以獲取等同於保存到數據庫的字符串。
我會用enum
並存儲在數據庫錶轉換爲String
枚舉值。 閱讀關於Java Enums的文章以獲取詳細信息。
你可以有一個枚舉代表方向
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