Возможно, это не самое элегантное решение, которое я мог бы в итоге найти, но оно решило мою проблему на данный момент.
Я создал генератор пользовательских последовательностей следующим образом:
public class CustomSequenceGenerator extends SequenceStyleGenerator implements Configurable {
private String sequenceCallSyntax;
@Override
public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException {
sequenceCallSyntax = "SELECT nextval('" + params.getProperty("sequence_name") + "')";
super.configure(type, params, serviceRegistry);
}
@Override
public Serializable generate(SessionImplementor s, Object obj) {
Serializable id = s.getEntityPersister(null, obj).getClassMetadata().getIdentifier(obj, s);
if (id != null && Integer.valueOf(id.toString()) > 0) {
return id;
} else {
Integer seqValue = ((Number) Session.class.cast(s)
.createSQLQuery(sequenceCallSyntax)
.uniqueResult()).intValue();
return seqValue;
}
}
}
И моя сущность стала такой:
@Entity
@Table(name = "usuario", schema = "adm")
@GenericGenerator(name = "CustomSequenceGenerator",
strategy = "<....my_package...>.CustomSequenceGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "adm.seq_usuario")
})
public class UsuarioEntity implements java.io.Serializable {
@Id
@GeneratedValue(generator = "CustomSequenceGenerator", strategy = GenerationType.SEQUENCE)
@Column(name = "id_usuario", unique = true, nullable = false)
private int id;
@Column(name = "name", length = 50)
private String name;
@Column(name = "active")
private Boolean active;
// getter and setter ommited
....
}
Таким образом, когда я сохраняю сущность с идентификатором NULL в моем сервисе, генератор возвращает nextval из моей последовательности, и если я устанавливаю идентификатор, который был задан центральным сервером, он корректно вставляется в мою таблицу.
Если есть более элегантное решение, пожалуйста, дайте мне знать, чтобы обновить этот ответ.