2009-10-16 5 views
1

Моя модель:Update отец на перехватчика

public class Father { 
    Set<Son> sons = new HashSet<Son>(); 
    String name = null; 
    Date lastSonModifyDate = null; 
    // ... other fields and setters/getters 
} 
public class Son { 
    Father father = null; 
    String name = null; 
    Date lastModifyDate = null; 
    // ... other fields and setters/getters 
} 

использования:

  1. Существует в БД Father объект с Son объекта, связанного (BiDir).
  2. Загрузить от отца DB.
  3. Обновить имя поля для отца.
  4. Обновить имя поля для сына.
  5. Постоянный отец.

Мой перехватчик сначала обнаруживает отцы обновления (onFlushDirty). Затем исполняет onFlushDirty для сына. В этом случае я обновляю son.lastModifyDate , а также father.lastSonModifyDate.

Когда исполнение заканчивается, все обновления сохраняются за исключением father.lastSonModifyDate. Я думаю, что это происходит потому, что отец находится в сессии и обновляется до сыновей, поэтому этот объект переопределяет изменения, сделанные методом onFlushDirty для объекта son.

Как я мог достичь своего знака (установить lastSonModifyDate отца от перехватчика сына)?

Спасибо.

ответ

0

Вы не можете. onFlushDirty() вызывается для элементов коллекции после он был вызван для владельца и Действие по обновлению (если есть) уже запланировано.

Есть ли причина, по которой вы не можете сделать все вышеперечисленное в своем DAO вместо того, чтобы полагаться на перехватчики? Или на уровне базы данных (отображение как lastModifyDate свойств, так и генерируемых)?

+0

Я не могу сделать это в DAO, потому что объекты сына, как правило, сохраняется/обновляется каскадом от объектов Дедов ... так что я не могу контролировать. Возможно, уровень базы данных - хорошее решение. Но, «сгенерировано» означает, что механизм базы данных создает временную привязку? действительно мне нужно установить атрибуты даты в конкретном формате, не поддерживаемые каким-либо движком db ... – Alberthoven

+0

Не уверен, что вы подразумеваете под «обновлением каскадом ... поэтому я не могу его контролировать». Если у вас есть, скажем, метод 'updateFather()' в вашем DAO, что мешает вам отмечать любые объекты, которые вы хотите, перед вызовом session.update()? Что касается базы данных, что означает «конкретный формат»? Дата - это дата (время/время, независимо), она сохраняется как таковая. Как вы отформатируете его в своем приложении, это совершенно другая история. – ChssPly76

+0

Хорошо, я почти никогда не называю DAO.saveOrUpdate для объектов Сон, но только для объектов Отца ... поэтому элементы Сон, связанные с Отцом, сохраняются в каскаде (с org.hibernate.annotations.Cascade). Во-вторых, я боюсь, что я не был полностью искренен в отношении полей даты: на самом деле, Father.lastSonModifyDate и Son.lastModifyDate представляют даты, но их тип - String, потому что используется String DateFormatter для чтения и записи их значений. .. Это причина, потому что формат мой «не поддерживается». – Alberthoven

0

вам необходимо переопределить onCollectionUpdate для объектов с каскадной опцией. это вызывается перед его назначением.

ура ~

Смежные вопросы