繁体   English   中英

使用非自动生成的ID保存在JPA / Hibernate中的替代方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM