我正在使用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
,但它也无济于事。我也没有指定任何属性,而是使用所有默认值。问题是什么
最佳答案
@GeneratedValue(strategy = GenerationType.IDENTITY)不能与String类型一起使用,我知道H2内存数据库不支持它。
如果要将键用作字符串,则必须在持久之前手动分配它
没有@GeneratedValue注释或为String类型正确定义@GeneratedValue。
@VladMichalcea有一个例子
https://vladmihalcea.com/hibernate-and-uuid-identifiers/。
另一个选择是将主键的类型更改为@GeneratedValue支持的类型
long(Long),int(Integer)。