Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于读取的JPA锁实体_Java_Jpa_Transactions - Fatal编程技术网

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。