У меня та же задача, что и у стартера темы. Благодаря предложению @ Matt Solnit я использую такие аннотации:
@Id
@NotNull
@Column(name = "UUID")
@GenericGenerator(name = "db-uuid", strategy = "guid")
@GeneratedValue(generator = "db-uuid")
private String uuid;
public String getUuid() { return uuid; }
public void setUuid(String uuid) { this.uuid = uuid; }
Типы
strategy = "guid"
и String
являются неотъемлемой частью решения.
Перед сохранением новых сущностей Hibernate выдает SQL-запрос:
select rawtohex(sys_guid()) from dual
Мои настройки: Oracle 11, Hibernate 4.3.4.Final, Spring 3.2.x. И поле raw(16)
в таблице для эффективного хранения и меньшего размера индекса, чем если вы используете char(32)
.
Когда я пытаюсь использовать java.util.UUID
в качестве типа поля идентификатора, я получаю сообщение об ошибке от Hibernate при сохранении новой сущности (при попытке установить String
type в поле java.util.UUID
).
Также я использую javax.xml.bind.DatatypeConverter
для запросов не в Hibernate (помощники Spring JDBC), для передачи конвертирования в byte[]
:
String query = "insert into TBL (UUID, COMPANY) values (:UUID, :COMPANY)";
MapSqlParameterSource parameters = new MapSqlParameterSource()
.addValue("COMPANY", repo.getCompany())
.addValue("UUID", DatatypeConverter.parseHexBinary(signal.getUuid()));
namedJdbcTemplate.update(query, parameters);
для извлечения:
ResultSet rs;
sig.id = DatatypeConverter.printHexBinary(rs.getBytes("UUID"));
Все веб-контроллеры получают такие коды, как:
025131763FB19522E050010A106D11E9
без {
, -
, }
символов (обычное представление UUID - {a-b-c-d-x-y}
, если вы помните). Это представление уже URL-кодировки чистое и безопасное. Вам не нужно реализовывать PropertyEditor
или Convertor
для String
типа:
@RequestMapping(value = {"/signal/edit/{id}.htm"}, method = RequestMethod.POST)
public String handleEditRequest(
@PathVariable("id") String id,
Сравните с неудачной попыткой использовать jaa.util.UUID
, где мне нужно написать:
@Component
public static class UUIDPropertyEditor extends PropertyEditorSupport {
@Override
public void setAsText(final String str) {
if (str == null || str.isEmpty()) {
setValue(null);
return;
}
setValue(UUID.fromString(str));
}
}
private @Autowired UUIDPropertyEditor juuidPE;
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(UUIDPropertyEditor.class, juuidPE);
}
для использования:
@PathVariable("id") UUID id,