我正在使用 spring data jpa
、spring boot
和 h2
数据库。
我的存储库看起来像这样
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;
使用覆盖的equals
和hashcode
。
我有一个如下所示的服务方法。
@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/