[英]Alternative to save in JPA/Hibernate with non autogenerated ID
我试图将值插入ID为String类型的数据库。
@Entity
@Table(name = "xpto_version_map")
public class XptoVersionMap implements Serializable {
@Id
@Column(name = "uniq_name", unique = true, nullable = false)
private String uniq_name;
...
尝试保存新的XptoVersionMap()时,例如:
XptoVersionMap xptoVersionMap = new XptoVersionMap();
xptoVersionMap.setUniqName("XPTO-1");
xptoVersionMap.setValue("value2");
xptoVersionMapRepository.save(xptoVersionMap);
会抛出:
org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find xxx.api.database.entity.XptoVersionMap with id XPTO-1; nested exception is javax.persistence.EntityNotFoundException: Unable to find xxx.api.database.entity.XptoVersionMap with id XPTO-1.
我尝试了不同的解决方案,但是除非我可以进行本机查询以插入值,否则我无法告诉Hibernate我只想检查@Id(uniq_name)是否存在,如果不插入新值,值,不要抛出异常。
这就是默认情况下Hibernate的工作方式。 当您保存方法并且未设置ID时,它将分配一个自动生成的ID。 如果有一个ID,它将尝试更新它(在您的情况下会发生什么)。
保存保持实体。 如果不存在,将分配一个标识符。 如果有的话,它实际上是在进行更新。 返回生成的实体ID。
您可以例如通过使用persist和@PrePersist来解决问题
@PrePersist
void generateId() {
if (uniq_name == null) {
uniq_name = GENERATE_SOME_UNIQUE_ID_SO_IT_DOESN'T_BREAK();
}
}
然后使用xptoVersionMapRepository.persist(xptoVersionMap);
或者,您可以使用以下代码编写自己的生成器:
@GenericGenerator(name = "my_generator", strategy = "package.CustomGenerator")
@GeneratedValue(generator = "my_generator")
然后创建一个实现IdentifierGenerator的类CustomGenerator并创建所需的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.