有没有人知道如何创建一个Java POJO,它在内存中存储了一个双倍但在磁盘上存储了一个整数?
我想将这些对象作为整数存储到磁盘,因为我有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在存储到数据库时强制进行双向整数转换(例如,通过舍入该双精度数)?
感谢您的帮助!
答案 0 :(得分: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 :(得分:1)
RDBMS倾向于根据精度和比例来定义列,而不是IEEE类型和位数。如果您只是定义一个固定比例为0的数据库列,那么当数据库自动减少数字时,您将获得所需的结果。
您可以定义一个保存它并转换的用户类型对象,但是如果您真的关心32位数字的内存占用,那么用自定义用户类型对象的引用替换它并不是真的向前迈出一步。 (虽然在您的应用程序代码中隐藏着hibernate的庞然大物,但担心原始int值似乎不是集中优化工作的好地方。)
答案 2 :(得分:0)
好吧我明白了:Hibernate会自动完成所有的舍入和转换。所以不需要任何聪明的东西。删除valueInteger。 value将以除了(其舍入值)之外的整数形式保存到数据库中。