【问题标题】:Hibernate: Save Double to Database as IntHibernate:将 Double 作为 Int 保存到数据库
【发布时间】:2011-06-20 09:04:25
【问题描述】:

有谁知道我如何创建一个 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 只有一个双精度数(当然还有 ID),并指示 hibernate 在存储到数据库时强制将双精度数转换为整数(例如,通过舍入该双精度数)?

感谢您的帮助!

【问题讨论】:

    标签: java database hibernate memory store


    【解决方案1】:

    好的,我想通了:Hibernate 会自动完成所有的舍入和转换。所以不需要任何聪明的东西。删除值整数。 value 将以整数形式保存到数据库中,除了(它的舍入值)。

    【讨论】:

      【解决方案2】:

      RDBMS 倾向于根据精度和比例来定义列,而不是 IEEE 类型和位数。如果你只是定义一个固定比例为 0 的数据库列,当数据库自动将数字砍掉时,你会得到你想要的结果。

      您可以定义一个用户类型对象来保存它并进行转换,但如果您真的关心 32 位数字的内存占用,那么将其替换为对自定义用户类型对象的引用并不是真正的进步. (尽管在你的应用程序代码下潜伏着休眠的庞然大物,但担心原始 int 值似乎不是一个集中优化工作的好地方。)

      【讨论】:

      • 谢谢!这绝对是一个选择,我没有考虑过。
      【解决方案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;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-12-24
        • 2017-10-22
        • 2021-11-16
        • 2016-09-22
        • 2011-02-04
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 2014-10-30
        相关资源
        最近更新 更多