Могу ли я сделать Hibernate прозрачным, чтобы избежать дублирования строк в базе данных?

У меня есть программа Java, которая использует Hibernate и MySQL для хранения большого количества данных трассировки использования Eclipse IDE. Эти данные содержат множество строк, таких как имена методов, каталоги, имя перспективы и т. д.

Например, объект события (который затем отражается в записи) может указывать исходный файл и текущий метод, имя пользователя и т. д. Очевидно, строковые данные могут повторяться.

Пока он находится в памяти, большая его часть интернализирована, поэтому все повторяющиеся строковые экземпляры указывают на один и тот же объект (я в этом уверен). Однако с @Basic (я использую аннотации) Hibernate отображает его в VARCHAR (255), что означает много потраченного впустую места.

Если бы я сам кодировал SQL, я мог бы заменить VARCHAR индексом для управляемой вручную таблицы поиска строк и сэкономить место (за счет дополнительных поисков).

Есть ли способ заставить Hibernate сделать это за меня? Я готов заплатить за пространство хитом производительности.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
276
3

Ответы 3

Я подозреваю, что вам понадобится объект-держатель строки, а затем убедитесь, что все эти объекты ссылаются на него.

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;
  }
}

Я думал об этом, но как бы надеялся, что есть более элегантный способ без необходимости изменять способ доступа к java-модели на стороне программы перед ее сохранением ... Кроме того, будет ли Hibernate достаточно умен, чтобы использовать это, это как поиск? Я не могу сделать строковое поле полем идентификатора ...

Uri 28.09.2008 03:06

Нет. Hibernate отслеживает вещи по идентификатору, и, как правило, строки не могут быть идентифицированы таким образом. Большинству людей просто не нужно так сильно заботиться о космосе, как вам.

sblundy 28.09.2008 03:11

Кроме того, для справочной таблицы нужен ключ, на который нужно ссылаться, а адрес памяти недоступен, поэтому вам все равно нужно указать идентификатор.

sblundy 28.09.2008 03:14

Основываясь на ответе sblundy, вам, вероятно, сойдет с рук что-то вроде:

class Foo {
    // client code uses this to get the value... ignored by Hibernate
    @Transient
    public String getString() {
        return getStringHolder().getString();
    }

    public StringHolder getStringHolder() {...}
}

По крайней мере, тогда клиентский код не обязательно должен знать об изменении. Хотя я не знаю, стоит ли это того.

Я полагаю, вы хотите посмотреть на настраиваемые типы значений. Это должно позволить вам хранить ваши строки как целочисленный идентификатор в базе данных. Конечно, вам придется предоставить отображение / поиск самостоятельно.

Другие вопросы по теме