[英]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.