java - spring data jpa实体从未被id找到

标签 java spring hibernate spring-data-jpa

我正在使用 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,但它也没有帮助。我也没有指定任何属性并使用默认值。

问题是什么

最佳答案

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

当您想将 key 用作字符串时,您必须在持久化之前手动分配它 没有 @GenerateValue 注解或正确定义 String 类型的 @GenerateValue。

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

另一个选项是将主键的类型更改为 @GenerateValue 支持的类型 long(长整型)、int(整数)。

关于java - spring data jpa实体从未被id找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57123928/

相关文章:

java - Maven 构建失败 : package does not exist

java - java中的函数多次调用时输出不同的结果

java - Spring 框架项目未加载?

java - 最后一个数据包成功发送到服务器是在 > 70,400,003 毫秒之前。比服务器配置的长

java - 在 Java 中获取 ClassCastException

java - 为什么 Spring Boot 不读取我的接口(interface)资源上定义的 PathVariable?

spring - 设置 bean 属性 'dataSource' 时出现错误无法解析对 bean 'dataSource' 的引用

java - Hibernate 在 Spring 事务中抛出 TransactionRequiredException

hibernate - Grails 条件查询与 fetchMode 急切,具有两个级别

java - 我的布局在低 dpi 设备上无法正确缩放