Какая потребность в атрибуте unsaved-value в спящем режиме?

Какая потребность в атрибуте unsaved-value?

<id name="userid" column="userid" type="java.lang.Long" unsaved-value="null">   
  <generator class="sequence">
    <param name="sequence">dmuseridseq</param>
  </generator> 
</id>

Ответы

Ответ 1

Это объясняется в этой блестящей статье:

Файл отображения Hibernate указывает, что поле id для Person является идентификатором базы данных (т.е. это первичный ключ в таблице PERSON). В теге id есть атрибут unsaved-value = "null", который указывает Hibernate использовать поле id для определения, был ли ранее сохранен объект Person или нет. Платформы ORM должны делать это различие, чтобы знать, должны ли они сохранять объект с помощью оператора SQL INSERT или UPDATE. В этом случае Hibernate предполагает, что поле id начинается с нуля на новых объектах и назначается при их первом сохранении.

Также вы можете прочитать о "unsaved-value" в книге "Сохранение Java в Hibernate":

enter image description here

Ответ 2

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html

unsaved-value (необязательно - значение по умолчанию означает "разумное" значение): значение свойства идентификатора, указывающее, что экземпляр является новым экземпляром (несохраненным), отличая его от отдельных экземпляров, которые были сохранены или загружены в предыдущем сеансе.

В вашем примере unsaved-value="null" кажется довольно бессмысленным, так как я подозреваю, что "разумное значение по умолчанию" для Long равно null.

Это более полезно для примитивных типов (например, int), который не может быть null, а несохраненное по умолчанию значение 0 может быть нежелательным в некоторых приложениях (0 является абсолютно допустимым числом).