我目前正在开发一个程序,该程序使用 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/