Спящий объект загружается сразу после создания - PullRequest
2 голосов
/ 26 октября 2011

У меня есть объект Hibernate, который имеет одно или несколько сопоставлений <many-to-one, например,

<hibernate-mapping>
  <class name="MyClass" table="my_table">
    <cache usage="nonstrict-read-write"/>
      <composite-id>
        <key-property name="id" length="30"/>
        <key-property name="someRef" length="30" column="foreign_key_to_something"/>
      </composite-id>
    <many-to-one name="mappedProperty" column="foreign_key_to_something" insert="false" update="false"/>
    <property name="foo" column="foo"/>
    ...
  </class>
</hibernate-mapping>

Мне нужно создать такой объект и получить немедленный доступ к mappedProperty после создания.Здесь я вижу два подхода:

1) Создайте сущность и установите все связанные сопоставления <many-to-one вручную.Очевидным недостатком этого подхода является необходимая работа, особенно если количество отображаемых <many-to-one объектов велико.Зачем делать что-то вручную, если Framework может сделать это за вас?

2) Создайте сущность, только инициализировав необходимые параметры (например, первичные ключи, id и someRef в приведенном выше случае), затем сохраните и повторно-Загрузите это немедленно.Загрузка должна инициализировать mappedProperty автоматически или обеспечивать отложенную инициализацию по требованию.

Я предпочитаю вариант 2), однако я заметил, что в некоторых случаях свойство mappedProperty не устанавливается.load() возвращает тот же объект, который я передал create(), только с инициализированными первичными ключами.Я до сих пор не уверен, почему это происходит, но для борьбы с этим мне пришлось бы отсоединить объект от сеанса Hibernate, чтобы load() был вынужден перейти в базу данных и получить заново.Опять же, звучит довольно сложно, не так ли?

Я что-то здесь упускаю?Есть ли другие способы решения этой проблемы?

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

Когда вам нужно обновить состояние объекта из базы данных, используйте refresh().

1 голос
/ 26 октября 2011

load и get возвращают объект из сеанса, если он уже там. Таким образом, ваш второй вариант потребует, чтобы вы очистили, затем удалили объект из сеанса, а затем перезагрузили его (выполнив запрос выбора для данных, которые вы знаете). Вызов на обновление будет делать то же самое, проще, но все равно будет выдавать дополнительный запрос на выбор из ничего.

Я действительно предпочитаю первый вариант: просто убедитесь, что каждый раз, когда устанавливается связь, затем сопоставляется соответствующее сопоставленное свойство. Вы несете ответственность за согласованность и инварианты сущностей (как и в случае двунаправленных ассоциаций, где должны поддерживаться обе стороны).

Третий вариант - полностью удалить сопоставленное свойство и просто вызвать entity.getKey (). GetSomeRef (). GetId ().

...