2011-02-03 82 views
1

沒有人知道如何創建一個Java POJO,它在內存中存儲雙精度數據,但在磁盤上使用整數?休眠:將Double Double保存到數據庫中作爲Int

我想將這些對象作爲整數存儲到磁盤上,因爲我有1億個,這樣可以節省空間。但是,有時我的Java代碼操縱在存儲器中的值(而不保存),並把它們轉化成實數

我已經試過類似:

@Entity 
@Table(name = "POJO") 
public class POJO { 
@Id 
@GeneratedValue 
@Column(name = "id") 
int id; 

@Column(name = "value") 
int valueInteger; // this is weird: in the database, we want to use integers, to save space. but in memory, sometimes we use real values 
double value; 

public int getValueInteger() { 
    return valueInteger; 
} 

public void setValueInteger(int valueInteger) { 
    this.valueInteger = valueInteger; 
    this.value = valueInteger; 
} 

public double getValue() { 
    return value; 
} 

public void setValue(double value) { 
    this.value = value; 
    // might want to call setValueInteger() here if consistency is required. Right now, I think it's not, so I'll leave it out. 
} 
} 

這不是一個可怕的解決方案,除了內存佔用比需要的大。有沒有辦法讓POJO只有一個double(和當然的ID),並指示hibernate在存儲到數據庫時強制執行double到integer的轉換(例如,通過四捨五入)?

感謝您的幫助!

回答

3

希望這個作品:

@Column(name = "value") 
private int intValue; 

@Transient 
private Double value = null; 

public double getValue() { 
    if (value == null) 
     value = intValue; 
    return value; 
} 

public void setValue(double value) { 
    this.value = value; 
    this.intValue = value; 
} 
1

RDBMS往往在精度和規模來定義列,而不是IEEE類型和位計數。如果您只是定義固定比例爲0的數據庫列,那麼當數據庫自動刪除數字時,您將得到想要的結果。

您可以定義一個用戶類型對象來保存它並進行轉換,但如果您真的關心32位數字的內存佔用情況,那麼將其替換爲對自定義用戶類型對象的引用並不是真正的步驟前鋒。 (儘管潛伏在您的應用程序代碼中的休眠的龐然大物,擔心原始的int值似乎不是一個集中優化工作的好地方。)

+0

謝謝!這絕對是一種選擇,我沒有想到這一點。 – iloveponies 2011-02-03 01:37:50

0

OK我想通了:Hibernate做了所有舍入並自動投射。所以不需要任何聰明的東西。除去valueInteger。值將以除了(四捨五入的值)之外的方式以整數形式保存到數據庫中。