2017-01-24 3 views
0

私は現在、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(); 

答えて

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

上記のコード行は間違いなく新しいオブジェクトを作成し、さらに書かれたコードごとにデータベースに追加します。

現在の実装では、シングルトンBeanを使用するか、または静的変数を使用して一度初期化されるグローバルHashMap参照を作成する必要があります。

しかし、アプリケーションを再起動しても同じことはできません。

行が存在するかどうかを確認するには、session.getメソッドを使用してください。行が存在しない場合は、データベースにさらに挿入してください。

または単にsession.saveOrUpdateを使用すると、行を更新するだけです。

上記の2つのメソッドを動作させるには、hibernateマッピングファイル内の識別子としてCompanyNameを定義する必要があります(hibernate.cfg.xmlあなたの場合)

関連する問題