spring-data-jpa 使用数据JPA和CrudRepository只保存不更新

3phpmpom  于 2022-11-10  发布在  Spring
关注(0)|答案(3)|浏览(304)

我在我的应用程序中有一个情况,我想保存新的记录。我正在使用Crudrepository保存()方法。我们都知道保存()将做什么保存,如果记录不在那里,并更新,如果它找到了。
但是我想限制更新操作。就像如果记录已经可用,既不更新也不保存该记录。
假设下面是我们的实体类,它有组合键。基于组合键,我们想做这个操作。
实体类别

@Entity
@IdClass(PrescriptionKey.class)
public class Prescription implements Serializable{

  @GeneratedValue(strategy=GenerationType.AUTO)
  @Column(name="prescription_id")
  private int prescriptionId;

  @Id
  @Column(name="dose_id")
  private int doseId;

  @Id
  @Column(name="med_id")
  private int medId;

  //Setter Getters
}

复合键类

public class PrescriptionKey implements Serializable {

  private int doseId;

  private int medId;

  //Setter Getter
}

假设每次保存操作的数据包含新数据沿着已经保存的旧数据,现在我们只想保存新数据。

xyhw6mcr

xyhw6mcr1#

有时可能是找不到您尝试更新的prescriptionId。由jpa提供的自动生成的prescriptionId小于您尝试更新的prescriptionId。因此JPA使用自动生成的prescriptionId而不是您尝试更新的prescriptionId创建新记录。

vsikbqxv

vsikbqxv2#

这确实是一个好问题。我想知道为什么JPA存储库中没有这样的工具。好吧,现在,您可以做的是依赖EntityManager来实现这一点。

entityManager.persist(entityName);

这将确保只有保存操作会发生。基于文档-如果实体已经保存,它将抛出一个EntityExistsException
参考:https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#persist-java.lang.Object-

ffscu2ro

ffscu2ro3#

那么JPA如何保存()的工作原理是,如果首先找到实体并对字段执行一些更新(s)。当您将同一实体传递回保存方法时,它将执行更新,因为该实体具有字段或字段(s)已更新。因此,如果您只想保存而不想更新,则需要创建一个包含所需值的新实体,然后将其传递给save方法。如果您没有违反列的唯一值约束,它将执行插入操作

相关问题