2012-02-29 66 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>