我在我的应用程序中有一个情况,我想保存新的记录。我正在使用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
}
假设每次保存操作的数据包含新数据沿着已经保存的旧数据,现在我们只想保存新数据。
3条答案
按热度按时间xyhw6mcr1#
有时可能是找不到您尝试更新的prescriptionId。由jpa提供的自动生成的prescriptionId小于您尝试更新的prescriptionId。因此JPA使用自动生成的prescriptionId而不是您尝试更新的prescriptionId创建新记录。
vsikbqxv2#
这确实是一个好问题。我想知道为什么JPA存储库中没有这样的工具。好吧,现在,您可以做的是依赖
EntityManager
来实现这一点。这将确保只有保存操作会发生。基于文档-如果实体已经保存,它将抛出一个
EntityExistsException
。参考:https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#persist-java.lang.Object-
ffscu2ro3#
那么JPA如何保存()的工作原理是,如果首先找到实体并对字段执行一些更新(s)。当您将同一实体传递回保存方法时,它将执行更新,因为该实体具有字段或字段(s)已更新。因此,如果您只想保存而不想更新,则需要创建一个包含所需值的新实体,然后将其传递给save方法。如果您没有违反列的唯一值约束,它将执行插入操作