Java JPA Hibernate-使用给定ID而不是序列插入

Java JPA Hibernate-使用给定ID而不是序列插入,java,hibernate,spring-boot,spring-data-jpa,spring-data,Java,Hibernate,Spring Boot,Spring Data Jpa,Spring Data,我正在重构一个系统以使用SpringBoot/JPA/Hibernate。 有一个例程,其中客户端实例从中央服务器接收要保存的对象列表。列表中的每个对象都有一个由中央服务器生成的ID,我在客户端实例上插入时必须使用相同的ID,但实体上的此ID是一个自动增量字段 我的实体: @Entity @Table(name = "usuario", schema = "adm") @SequenceGenerator(name="seq_usuario_generator", sequenceName =

我正在重构一个系统以使用SpringBoot/JPA/Hibernate。 有一个例程,其中客户端实例从中央服务器接收要保存的对象列表。列表中的每个对象都有一个由中央服务器生成的ID,我在客户端实例上插入时必须使用相同的ID,但实体上的此ID是一个自动增量字段

我的实体:

@Entity
@Table(name = "usuario", schema = "adm")
@SequenceGenerator(name="seq_usuario_generator", sequenceName = "adm.seq_usuario", allocationSize=1)
public class UsuarioEntity implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_usuario_generator")

    @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
    ....
}
应该是这样的:

...
UsuarioEntity user = new UsuarioEntity();
user.setId(idFromCentralServer);
user.setName("Testing insert with given ID");
usuarioRepo.save(user);
...
@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,并从本地序列生成一个新ID


有没有办法保存一个对象,这样我就可以设置一个ID而不必从序列中获取它?

只需删除
@GeneratedValue
注释即可

 @Id
 @Column(name = "id_usuario", unique = true, nullable = false)
 private int id;

也许这不是我最终能得到的最优雅的解决方案,但现在它解决了我的问题

我创建了一个自定义序列生成器,如下所示:

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


}
我的实体是这样的:

...
UsuarioEntity user = new UsuarioEntity();
user.setId(idFromCentralServer);
user.setName("Testing insert with given ID");
usuarioRepo.save(user);
...
@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
    ....
}
@实体
@表(name=“usuario”,schema=“adm”)
@GenericGenerator(name=“CustomSequenceGenerator”,
strategy=“.CustomSequenceGenerator”,
参数={
@参数(name=“sequence\u name”,value=“adm.seq\u usuario”)
})
公共类UsuarioEntity实现java.io.Serializable{
@身份证
@GeneratedValue(generator=“CustomSequenceGenerator”,策略=GenerationType.SEQUENCE)
@列(name=“id\u usuario”,unique=true,nullable=false)
私有int-id;
@列(name=“name”,长度=50)
私有字符串名称;
@列(name=“active”)
私有布尔活动;
//吸气剂和塞特
....
}
这样,当我在我的服务中将ID为null的实体保存时,生成器将从序列中返回nextval,如果我设置了中央服务器提供的ID,它将正确插入到我的表中


如果有更优雅的解决方案,请让我知道更新这个答案

在这里发现了类似的问题,希望它能帮助我删除序列生成器,因为它在系统的许多其他部分中使用。我问的问题是一些特定的功能,其中ID由中央服务器提供。好的,包括您需要从中央服务器自动生成ID和ID,这将是您问题中的一个重要信息。