Java 用于读取的JPA锁实体
我有我的密码:Java 用于读取的JPA锁实体,java,jpa,transactions,Java,Jpa,Transactions,我有我的密码: public static Computation findByDateAndPaymentSystem(EntityManager em, Calendar date, PaymentSystem paymentSystem) throws SCException { Query query = em.createNamedQuery("Computation.findByDateAndPaymentSystem"); query.setPara
public static Computation findByDateAndPaymentSystem(EntityManager em, Calendar date, PaymentSystem paymentSystem) throws SCException {
Query query = em.createNamedQuery("Computation.findByDateAndPaymentSystem");
query.setParameter("date", date);
query.setParameter("ps", paymentSystem);
List<Computation> computationList = query.getResultList();
if (computationList != null && computationList.size() > 0) {
if (computationList.size() == 1) {
return computationList.get(0);
} else {
throw new SCException("Not unique result in computation for date '"
+ new SimpleDateFormat("dd.MM.yyyy").format(new Date(date.getTimeInMillis())) + "' and paymentSystem = '"
+ paymentSystem.getShortName() + "'");
}
} else {
Computation computation = new Computation();
computation.setDate(date);
computation.setComputationState(ComputationState.CREATED);
computation.setPaymentSystem(paymentSystem);
em.persist(computation);
return computation;
}
}
公共静态计算findByDateAndPaymentSystem(EntityManager em、日历日期、PaymentSystem PaymentSystem)抛出SCException{
Query Query=em.createNamedQuery(“Computation.findByDateAndPaymentSystem”);
query.setParameter(“日期”,日期);
query.setParameter(“ps”,paymentSystem);
List computationList=query.getResultList();
if(computationList!=null&&computationList.size()>0){
if(computationList.size()==1){
返回计算列表。获取(0);
}否则{
抛出新的SCException(“日期”的计算结果不唯一”
+新的SimpleDataFormat(“dd.MM.yyyy”).format(新日期(Date.getTimeInMillis())+“'和paymentSystem='”
+paymentSystem.getShortName()+“'”);
}
}否则{
计算=新计算();
计算。设置日期(日期);
computation.setComputationState(ComputationState.CREATED);
计算。setPaymentSystem(paymentSystem);
em.persist(计算);
收益计算;
}
}
其主要思想是,我应该有一个计算实例,每个日期和支付系统。
但如果在两个不同的事务中调用此方法,则可能出现以下情况:
第一个事务检查,如果此日期和创建计算没有计算,但仍然没有提交创建的计算,则另一个事务检查和创建计算,然后两个事务都提交。因此,每个日期将进行两次计算
如何预防
计算。日期
和付款系统的组合应该是唯一的(约束),然后第二次插入将失败,或者如果找到多个条目,您可以尝试合并它们。解决方案取决于您的用例、交易策略和设置。如果数据和支付系统的组合是数据库中的唯一约束,则您将永远无法在实体上插入重复计算。是否有任何方法在JPA中在两个字段上创建唯一约束。这是必需的,因为我从JPA实体生成db的shema。