Как я могу оптимально обновить одно свойство в объекте, используя Hibernate? - PullRequest
0 голосов
/ 13 мая 2009

У меня есть объект:

public class Data {
    private long           id;
    private long           referenceCount;
    private Blob           dataCache;

    /* getters and setters for the above */
}

Соответствует это отображение:

<hibernate-mapping>
  <class name=Data" table=DATA">

    <id name=id" type="long">
      <column name=DATA_ID" precision="20" scale="0" />
      <generator class="assigned" />
    </id>

    <property name="referenceCount" type="long" generated="always" insert="false" update="false">
      <column name="REFERENCE_COUNT" precision="10" scale="0" not-null="true" />
    </property>
    <property name=dataCache" type="blob">
      <column name="DATA" />
    </property>
  </class>
</hibernate-mapping>

Содержимое 'dataCache' может быть довольно большим.

Вот где это становится сложным: значение referenceCount устанавливается триггером, вызывается объектом, который не имеет отношения отображения к объекту Data. Как только когда я сохраняю этот объект, я должен обновить объект данных - который может или не может уже загружен сессией - чтобы сохранить счетчик ссылок правильный. Оставляя в стороне, рассматривается ли это как хорошая идея, я должен убедиться, что значение referenceCount актуально в моем локальном сеансе, но я НЕ хочу перезагружать двоичный объект dataCache. Я мог бы установить ленивый атрибут на это свойство, но я не уверен, что оно будет действовать так, как я надеюсь, будет.

Как мне это сделать? Я думаю, что я мог бы взглянуть на это так: «Как я могу удалить объект из кэша сеанса, не загружая этот объект, если его там еще нет?»

Ответы [ 2 ]

2 голосов
/ 13 мая 2009

Согласно этому сообщению на форуме , поле типа java.sql.Blob/Clob должно поддерживать отложенную загрузку. Следовательно, можно ожидать, что выполнение Session.refresh() на постоянном экземпляре Data, как указано в документации, перечитает состояние данного экземпляра из базовой базы данных, но не загрузит dataCache.

Тем не менее, я бы порекомендовал вам переместить dataCache в отдельный класс и отобразить его как обязательное отношение один к одному. Убедитесь, что у вас нет каскадного обновления с Data до DataCache. Таким образом, вы можете полностью контролировать, что обновляется, а что загружается.

0 голосов
/ 13 мая 2009

Почему бы не сделать так, чтобы объект обновлял referenceCount в домене всякий раз, когда он запускает триггер в БД, чтобы синхронизировать его с постоянным значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...