Java JPA Hibernate-使用给定ID而不是序列插入
我正在重构一个系统以使用SpringBoot/JPA/Hibernate。 有一个例程,其中客户端实例从中央服务器接收要保存的对象列表。列表中的每个对象都有一个由中央服务器生成的ID,我在客户端实例上插入时必须使用相同的ID,但实体上的此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 =
@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,这将是您问题中的一个重要信息。