java - 防止在 Spring Hibernate 中存储重复值的正确方法

标签 java mysql spring hibernate spring-mvc

我目前正在开发一个程序,该程序使用 Spring 和 Hibernate 每 31 秒检索一次数据(Spring 计划服务)并保存到 mysql 表(Hibernate)。

我目前有一个 HashMap 正在检查检索到的数据。如果检索到的数据在 HashMap 中,则使用该实例。如果数据不在HashMap中,则将其添加到HashMap中并通过Hibernate保存这个新条目。

我对这个设计唯一关心的是,由于这是一个每 31 秒运行一次的 Spring 调度服务,HashMap 对象是否也会每 31 秒重新创建一次?在这种情况下,之前添加到 HashMap 中的任何条目都将不再存在,并且重复的条目将保存到表中,对吗?

解决此问题的最佳做法是什么?谢谢。

我的代码:

@Scheduled(fixedRate = 31000)
public void saveCompanyData() {               

            // Retrieve data from online into Data
            ...
            ...

            // Hibernate
            SessionFactory factory = new Configuration()
            .configure("hibernate.cfg.xml")
            .addAnnotatedClass(Company.class)
            .buildSessionFactory();
            Session session = factory.getCurrentSession();
            session.beginTransaction();

            // Create HashMap
            HashMap<String, Company> companyMap = new HashMap<>();

            // Save to table if key not mapped
            String companyKey = Data.getCompanyName();
            Company company;
            if(companyMap.containsKey(companyKey)){
                company = companyMap.get(companyKey);
            } else {
                company = new company(Data.getCompanyName());
                companyMap.put(companyKey, company);
                session.save(company);
            }

            // Commit
            session.getTransaction().commit();

最佳答案

HashMap<String, Company> companyMap = new HashMap<>()

上面的代码行肯定会创建一个新对象并将其添加到数据库中,按照进一步编写的代码。

在当前的实现中,您必须创建一个全局 HashMap 引用,该引用通过使用单例 bean 或使用静态变量初始化一次。

但是一旦您的应用程序重新启动,同样的方法就不起作用了。

您应该使用 session.get 方法检查数据库是否存在该行,如果行不存在,则进一步插入数据库。

或者您可以只使用session.saveOrUpdate,因为它只会更新行。

要使上述两种方法起作用,您必须在 hibernate 映射文件中将 companyName 定义为标识符(在您的情况下是 hibernate.cfg.xml)

关于java - 防止在 Spring Hibernate 中存储重复值的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41836434/

相关文章:

java - 使用连接在 Hibernate 查询语言中选择

php - 具有重复项的数组中值的总和

python - "Not all parameters were used in the SQL statement"- 如何使用 python 在 mysql 中插入 API json 数据?

spring - java.lang.IllegalStateException(未找到方法) : Calling MockMvc. 使用自定义 Filter 在一次测试中执行多次

java - 使用方法更改链接列表

克隆实体上的 java.util.ConcurrentModificationException

java - Spring缓存,不同缓存上相同的key

java - 使用 Springs 事务管理与使用 hibernate 的好处

java - 更改字符串中的字符(路径)Java

mysql - 在 SQL 中搜索后更新找到的行中的列值