繁体   English   中英

仅使用数据 JPA 和 CrudRepository 保存不更新

[英]Only save not update using data JPA and CrudRepository

我的应用程序中有一种情况,我想保存新记录。 我正在使用 Crudrepository save() 方法。 众所周知,如果记录不存在,save() 将执行什么保存,如果找到则更新。

但我想限制更新操作。 就像如果记录已经可用,则更新不保存该记录。

假设下面是我们的实体 class ,它具有复合键。 并基于复合键我们想要做这个操作。

实体 class

@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
}

复合键 class

 public class PrescriptionKey implements Serializable {

  private int doseId;

  private int medId;

  //Setter Getter
}

假设每次用于保存操作的数据都包含新数据以及已保存的旧数据。 现在我们只想对新数据执行保存。

有时可能是您尝试更新的处方 ID 未找到。 jpa 提供的自动生成的处方 ID 小于您尝试更新的处方 ID。 因此,JPA 使用自动生成的处方 ID 而不是您要更新的处方 ID 创建一个新记录。

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

entityManager.persist(entityName);

这将确保只发生保存操作。 根据文档 - 如果实体已经保存,它将抛出EntityExistsException

参考: https : //docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#persist-java.lang.Object-

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM