У меня есть программа Java, которая использует Hibernate и MySQL для хранения большого количества данных трассировки использования Eclipse IDE. Эти данные содержат множество строк, таких как имена методов, каталоги, имя перспективы и т. д.
Например, объект события (который затем отражается в записи) может указывать исходный файл и текущий метод, имя пользователя и т. д. Очевидно, строковые данные могут повторяться.
Пока он находится в памяти, большая его часть интернализирована, поэтому все повторяющиеся строковые экземпляры указывают на один и тот же объект (я в этом уверен). Однако с @Basic (я использую аннотации) Hibernate отображает его в VARCHAR (255), что означает много потраченного впустую места.
Если бы я сам кодировал SQL, я мог бы заменить VARCHAR индексом для управляемой вручную таблицы поиска строк и сэкономить место (за счет дополнительных поисков).
Есть ли способ заставить Hibernate сделать это за меня? Я готов заплатить за пространство хитом производительности.




Я подозреваю, что вам понадобится объект-держатель строки, а затем убедитесь, что все эти объекты ссылаются на него.
class StringHolder {
private Long id;
private String string;
public StringHolder() {/* Not sure if this is necessary */}
public StringHolder(String string) {
this.string = string;
}
public void getString() {
return this.string;
}
}
Нет. Hibernate отслеживает вещи по идентификатору, и, как правило, строки не могут быть идентифицированы таким образом. Большинству людей просто не нужно так сильно заботиться о космосе, как вам.
Кроме того, для справочной таблицы нужен ключ, на который нужно ссылаться, а адрес памяти недоступен, поэтому вам все равно нужно указать идентификатор.
Основываясь на ответе sblundy, вам, вероятно, сойдет с рук что-то вроде:
class Foo {
// client code uses this to get the value... ignored by Hibernate
@Transient
public String getString() {
return getStringHolder().getString();
}
public StringHolder getStringHolder() {...}
}
По крайней мере, тогда клиентский код не обязательно должен знать об изменении. Хотя я не знаю, стоит ли это того.
Я полагаю, вы хотите посмотреть на настраиваемые типы значений. Это должно позволить вам хранить ваши строки как целочисленный идентификатор в базе данных. Конечно, вам придется предоставить отображение / поиск самостоятельно.
Я думал об этом, но как бы надеялся, что есть более элегантный способ без необходимости изменять способ доступа к java-модели на стороне программы перед ее сохранением ... Кроме того, будет ли Hibernate достаточно умен, чтобы использовать это, это как поиск? Я не могу сделать строковое поле полем идентификатора ...