Можно ли сделать Hibernate прозрачно, чтобы избежать дублирования строк в базе данных? - PullRequest
2 голосов
/ 28 сентября 2008

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 28 сентября 2008

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

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

    public StringHolder getStringHolder() {...}
}

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

0 голосов
/ 06 октября 2008

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

0 голосов
/ 28 сентября 2008

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

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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...