当前位置: 首页 > 知识库问答 >
问题:

Spring JPA-无法在时循环中更新,插入作品

通和裕
2023-03-14

我使用spring data/jpa来执行一些数据库操作。我有一个while循环,它运行并在运行时成功插入数据,但我还需要在每次运行while循环结束时执行更新操作。这是我在一个简单示例中的基本内容。这正是我正在使用的结构。

类执行所有操作:

@Component
public class MyClassImpl implements MyClass {
    @Autowired
    MyOtherClass myOtherClass;

    @Override
    public void run() {
        while (expression) {
            // get some data into and entity object

            myOtherClass.insertMethod(entity);
            myOtherClass.updateMethod(entityId);
        }
    } 

}

我的另一个类:

@Component
public class MyOtherClassImpl implements MyOtherClass {

    @Override
    JpaClass jpaClass;

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void insertMethod(EntityObject entity) {
         jpaClass.save(entity);
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateMethod(String entityId) {
         EntityObject entity = jpaClass.findById(entityId);
         //change something on the entity
         jpaClass.save(entity);
    }
}

实体对象:

public interface JpaClass extends JpaRepository<EntityObject, Long> {
      EntityObject findById(String entityId);
}

我遇到的问题是,insert工作得很好,但在while循环中,我无法像以前那样获得任何更新。我试着将逻辑四处移动,并将findById逻辑放在不同的方法中,但无法使其工作。我试图更新表中的一行,该行处理1个值,然后需要在下一次运行while循环时引用。

所以它是这样的:

  1. 获取值
  2. 使用值操作
  3. 更新值
  4. 重复

我在一个类上使用spring@Configuration设置了数据库配置,该类可以很好地处理所有事务,作为参考,它基本上是这样设置的:

@Configuration
@EnableTransactionManagement
@PropertySource(value = { "classpath:/${app.execution.environment}/application.properties" })
@EnableJpaRepositories(basePackages = "com.example", entityManagerFactoryRef = "mysqlEntityManager", transactionManagerRef = "mysqlTransactionManager")
public class MysqlHibernateConfig {

// all the needed beans here
}

同样需要确认的是,我在没有while循环的情况下运行了这个逻辑,并且数据确实按预期更新,因此问题出在数据库事务中的某个地方,但我一直在研究如何解决它。

共有1个答案

邴俊民
2023-03-14

此问题是由缓存引起的。你可以这样试试。

>

  • 在服务类中,

        @Autowired
        private EntityManager entityManager;
        entityManager.clear();
    

    正在应用中。属性,您应该设置

        spring.jpa.open-in-view = false
    

  •  类似资料:
    • 每秒钟我都会创建一个新的圆,并将其添加到名为“形状”的圆阵列列表中。我需要他们将其添加到MyPane,以便在javafx窗口中显示 然而我得到了这个错误。 线程“Timer-0”java中出现异常。lang.IllegalStateException:不在FX应用程序线程上;currentThread=Timer-0 我曾尝试使用其他计时方法,如ScheduledExecutorService,但

    • 我有一个表,有多条记录具有相同的ID但不同的值。我想从其他表复制记录到这个表。如果记录为空,我想更新到最小位置,或者如果值不存在,插入到下一个位置。 这是我的目标表: ID|职位|价值 1 | 1 | A 2 | 1 | B 2 | 2 |空 2 | 3 |空 2 | 4 | C 3 | 1 | A 4 | 1 | D 4 | 2 | B 源表: ID |值 1 | C 2|N 3 | B 4 |

    • 数据结构如下: 转介及统计数字 现在,对于这个表,我想插入两个数组,第一个数组将成功插入,如下所示: 现在第二个数组是$userWriterReferralStatsArray,在插入这个数组时,我想检查是否重复了相同的日期和相同的注册用户id,然后它应该更新,而不是插入新行。我如何实现它,或者请建议我是否有其他好的方法来实现它,因为有大量的行。 提前感谢

    • 问题内容: 我正在制作一个运行一些cmd命令(USMT和文件传输)的程序 它工作正常,但是只有在完成操作后,我才从文本框中的cmd获取最后一行。我希望它打印cmd实时输出的内容。 问题答案: 问题的根本原因是您阻止了事件调度线程,这将阻止在执行命令后更新UI。 Swing是一个单线程框架,这意味着您不应在EDT上下文中执行阻塞或长时间运行的代码。Swing也不是线程安全的,这意味着永远不要在EDT

    • 这里一个非常常见的问题是如何执行upsert,MySQL称之为,标准支持将其作为操作的一部分。 鉴于PostgreSQL不直接支持它(在PG9.5之前),您如何做到这一点?考虑以下几点: 现在假设您要“upsert”元组,,那么新的表内容将是: 这就是人们在讨论时所谈论的。至关重要的是,在同一表上存在多个事务的情况下,任何方法都必须是安全的--要么使用显式锁定,要么以其他方式防止产生的竞争条件。

    • 问题内容: 在执行do-while循环时,让JButton重复更新(与计时器一起使用)时遇到了一些麻烦。我正在开发一个简单的游戏,在10 * 10的图块对象网格上玩,该对象对应于具有100个按钮的JButton arrayList。 程序的此部分处理简单的寻路(即,如果我单击角色,然后单击一个空的图块,则角色将在到达目标的途中在每个图块中移动)。每个步骤之间都有一定的延迟,因此用户可以看到角色的进