Hibernate: Сохранить Double в базу данных как Int - PullRequest
1 голос
/ 03 февраля 2011

Кто-нибудь знает, как я могу создать Java POJO, который хранит двойное в памяти, но целое число на диске?

Я бы хотел хранить эти объекты на диске как целые числа, потому что у меня их 100 миллионов, и это сэкономило бы место. Однако иногда мой 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 имел только двойное значение (и, конечно, идентификатор) и давал команду hibernate принудительно преобразовывать двойное в целое при сохранении в базу данных (например, путем округления этого двойного)?

Спасибо за помощь!

Ответы [ 3 ]

3 голосов
/ 03 февраля 2011

Надеюсь, что это работает:

@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 голос
/ 03 февраля 2011

СУБД, как правило, определяют столбцы с точки зрения точности и масштаба, а не типов IEEE и количества битов.Если вы просто определите столбец базы данных с фиксированным масштабом 0, вы получите желаемый результат, когда БД автоматически выберет число.

Вы можете определить объект пользовательского типа, который содержит его и преобразует, но если выВы искренне обеспокоены объемом памяти 32-битного числа, замена которого ссылкой на объект пользовательского типа на самом деле не является шагом вперед.(Хотя с бегемотом, который находится в спящем режиме, скрывается под кодом вашего приложения, беспокойство о примитивных значениях int не кажется хорошим местом для концентрации усилий по оптимизации.)

0 голосов
/ 04 февраля 2011

ОК. Я понял: Hibernate выполняет все округления и преобразования автоматически. Так что не нужно ничего умного. Удалить значениеInteger. значение будет сохранено в базе данных в виде целого числа, кроме как (его округленное значение).

...