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 楼答案
上面的代码行肯定会创建一个新对象,并根据进一步编写的代码将其添加到数据库中
在当前的实现中,必须创建一个全局HashMap引用,该引用通过使用单例bean或使用静态变量初始化一次
但一旦应用程序重新启动,同样的方法就不起作用了
如果行存在或不存在,则应使用
session.get
方法检查数据库,如果行不存在,则应进一步插入数据库或者您可以使用
session.saveOrUpdate
,因为它只会更新行要使上述两种方法发挥作用,您必须在hibernate映射文件中将companyName定义为标识符(
hibernate.cfg.xml
)