有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java防止在spring hibernate中存储重复值的正确方法

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

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

我唯一关心的是,由于这是一个每31秒运行一次的Spring schedule服务,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();

共 (1) 个答案

  1. # 1 楼答案

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

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

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

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

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

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

    要使上述两种方法发挥作用,您必须在hibernate映射文件中将companyName定义为标识符(hibernate.cfg.xml