JPA Hibernate - вставка с заданным идентификатором, а не с последовательностью

RFC 2396 раздел 4.1:

Когда ссылка URI используется для выполнения поиска по идентифицированному ресурсу, необязательный идентификатор фрагмента, отделенный от URI посредством символа crosshatch ("#"), состоит из дополнительной справочной информации, которая должна быть интерпретирована пользовательским агентом после успешного завершения поиска. Таким образом, он не является частью URI, но часто используется в сочетании с URI.

blockquote>

(выделено мной)

1
задан henriqueor 20 March 2019 в 04:37
поделиться

1 ответ

Возможно, это не самое элегантное решение, которое я мог бы в итоге найти, но оно решило мою проблему на данный момент.

Я создал генератор пользовательских последовательностей следующим образом:

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
    ....
}

Таким образом, когда я сохраняю сущность с ID как ноль на В моем сервисе генератор возвращает nextval из моей последовательности, и если я устанавливаю идентификатор, который был задан центральным сервером, он корректно вставляется в мою таблицу.

Если есть более элегантное решение, пожалуйста, дайте мне знать, чтобы обновить этот ответ.

0
ответ дан henriqueor 20 March 2019 в 04:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: