我正在使用spring data jpaspring booth2数据库。

我的资料库看起来像这样

public interface IComponentStorageRepository extends JpaRepository<ComponentData, String> {
}


我的域对象看起来像这样

@Entity
@Table(name = "component_data")
public class ComponentData {
    @Column(name = "component_id")
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String componentId;
    private String description;


用覆盖的equalshashcode

我有一个看起来像这样的服务方法。

@Override
public void updateComponent(String componentId, String description) {
    if (repository.existsById(componentId)) {
        ComponentData stored = repository.getOne(componentId);
        stored.setDescription(description);
        repository.saveAndFlush(stored);
    } else {
        ComponentData stored = new ComponentData();
        stored.setComponentId(componentId);
        stored.setDescription(description;
        repository.saveAndFlush(newResult);
    }
}


它首先执行检查对象是否存在(以防止EntityNotFound异常),然后尝试读取该对象。如果找不到任何对象,则应创建一个新对象。

但是每次我尝试调用该方法时,它永远无法找到该实体。每次创建一个新的。

我最初使用repository.save并在该方法上使用了@Transactional,但它也无济于事。我也没有指定任何属性,而是使用所有默认值。

问题是什么

最佳答案

@GeneratedValue(strategy = GenerationType.IDENTITY)不能与String类型一起使用,我知道H2内存数据库不支持它。

如果要将键用作字符串,则必须在持久之前手动分配它
没有@GeneratedValue注释或为String类型正确定义@GeneratedValue。

@VladMichalcea有一个例子
https://vladmihalcea.com/hibernate-and-uuid-identifiers/

另一个选择是将主键的类型更改为@GeneratedValue支持的类型
long(Long),int(Integer)。

10-06 03:46