gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:53:30 25 4
gpt4 key购买 nike

我正在重构一个系统以使用 Spring Boot/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);
...

当我执行此代码时,给定的 ID 将被忽略,并从本地序列生成一个新的 ID。

有什么方法可以保存一个可以设置 ID 的对象,而无需从序列中获取它吗?

当未提供给定 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;
}
}


}

我的实体是这样的:

@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 为 null 的实体保存时,生成器会从我的序列中返回 nextval,并且如果我设置中央服务器给出的 ID,它将正确插入到我的表中。

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

关于java - JPA Hibernate - 使用给定 ID 插入,而不是序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55253674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com