2013-08-09 3 views
0

Прежде всего, мне нужно сказать, что я не эксперт в Hibernate. Я использовал его только в других проектах. Но теперь я хочу использовать Hibernate в устаревшей схеме базы данных, но у меня возникают некоторые трудности с отображением таблиц в модель домена Java:Модель домена домена до устаревшей базы данных

1) В большинстве таблиц имеется первичный ключ (как строка) пользователем. Поэтому они не генерируются по некоторому алгоритму. На самом деле это то, что Hibernate называет «естественными» ключами. Есть ли способ сообщить Hibernate принять идентификатор, назначенный пользователем?

2) Вторая проблема заключается в том, что множество таблиц имеет некоторые общие свойства: valid_from, valid_to, date_created, date_last_modified, user_last_modified & user_created. Эти свойства используются для аудита (какая запись была изменена каким пользователем) и отключить записи, когда поле даты «valid_to» находится в прошлом. Я не хочу раскрывать эти поля конечному пользователю, потому что они, похоже, являются «метаданными», но я должен найти способ обновить эти поля. Есть ли общее решение в Hibernate, которое я могу использовать для обновления этих полей всякий раз, когда изменяется запись? Для информации эти поля также используются в «таблицах ссылок», которые используются для управления отношениями «многие ко многим» между двумя таблицами.

Вся помощь очень ценится!

update: Я использую AbstractEntity для хранения общих свойств и использования EventListener для вставки/обновления этих полей. Пользователь будет извлекаться кем-то UserContext.getCurrentUser() (пользователь будет привязан к текущему потоку с помощью ThreadLocal).

Единственная проблема теперь в том, как бороться с этими таблицами ассоциации ... Они также содержат эти общие поля, и я не хочу создавать отдельный класс для сопоставления такой таблицы ассоциаций. На мой взгляд, Hibernate отлично справляется с тем, чтобы скрыть такой стол. У меня есть способ обновить такую ​​таблицу ссылок с помощью EventListener?

Например: если таблица A имеет отношение «многие ко многим» с классом B через таблицу ссылок A_B, есть ли способ обновить A_B всякий раз, когда запись вставлена ​​/ обновлена ​​на A или B?

ответ

1

Я предполагаю, что вы используете аннотации JPA для объявления вашего сопоставления.

Первая проблема. Просто не применяйте @GeneratedValue аннотация.

public class SomeEntityWithAutogeneratedId { 
    @Id 
    @GeneratedValue // autogeneration 
    private Long id; 
} 

public class SomeEntityWithoutAutogeneratedId { 
    @Id 
    private String id; 
} 

Вторая проблема. Вы можете подготовить базовый класс для упрощения сопоставления общих полей. Затем вы можете использовать @PrePersist применять правильные значения для всех необходимых полей перед обновлением:

public abstract class AbstractEntity { 

    @Column 
    private Date dateLastModified; 

    @PrePersist 
    public void beforePersist() { 
     this.dateLastModified = new Date(); 
    } 
} 

public class Entity1 extends AbstractEntity { 
public class Entity2 extends AbstractEntity { 
public class Entity3 extends AbstractEntity { 
... 
public class EntityN extends AbstractEntity { 

В общем, если вы хотите использовать устаревшую базу данных с помощью Hibernate будет лучше пересмотреть структуры таблиц/отношения и внести соответствующие изменения перед началом напишите код. Это может сэкономить вам много времени. Например, это будет лучше:

  • заменить составные ключи с автоматически сгенерированными уникальными идентификаторами (см this entry from the official documentation для объяснения)
  • Remove/заменить функции гибернации или кода Java всех триггера или хранимые процедуры. Если вся ваша логика находится в коде приложения, тогда будет легко использовать функции кеша.
  • Я не могу себе представить, что-то еще прямо сейчас, но вы можете иметь очень длинный список, потому что база данных SQL дает гораздо больше энергии/Fetures, которые не могут быть легко использованы с помощью Hibernate
Смежные вопросы