2012-07-31 14 views
0

是否可以使用泛型與genericPersistisUniqueEntity?該堅持的方法看起來相當簡單:使用泛型檢查@Unique的@Entity

package net.bounceme.dur.usenet.driver; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.mail.Folder; 
import javax.mail.Message; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.TypedQuery; 
import net.bounceme.dur.usenet.model.Article; 
import net.bounceme.dur.usenet.model.Newsgroup; 
import net.bounceme.dur.usenet.model.Usenet; 

public class Main { 

    private static final Logger LOG = Logger.getLogger(Main.class.getName()); 
    private Usenet u = Usenet.INSTANCE; 

    public static void main(String[] args) { 
     try { 
      Main main = new Main(); 
     } catch (Exception ex) { 
      Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public Main() throws Exception { 
     EntityManagerFactory emf; 
     EntityManager em; 
     emf = Persistence.createEntityManagerFactory("USENETPU"); 
     List<Newsgroup> subscribed = getFolders(); 
     em = emf.createEntityManager(); 
     for (Newsgroup newsgroup : subscribed) { 
      persistNewsgroups(em, newsgroup); 
      List<Message> messages = u.getMessages(newsgroup.getNewsgroup()); 
      LOG.fine(newsgroup + " " + messages.size() + " messages"); 
      for (Message message : messages) { 
       LOG.fine("message " + message.getMessageNumber()); 
       Article article = new Article(message); 
       persistArticle(em, article); 
      } 
     } 
     em.close(); 
    } 

    private boolean isUniqueArticle(Article article, List<Article> articles) { 
     LOG.fine(articles.toString()); 
     for (Article a : articles) { 
      if (a.getSubject().equalsIgnoreCase(article.getSubject())) { 
       return false; 
      } 
     } 
     LOG.fine("new\t\t" + article); 
     return true; 
    } 

    private void persistArticle(EntityManager em, Article article) { 
     LOG.fine(article.toString()); 
     TypedQuery<Article> query = em.createQuery("SELECT a FROM Article a", Article.class); 
     List<Article> results = query.getResultList(); 
     if (isUniqueArticle(article, results)) { 
      em.getTransaction().begin(); 
      em.persist(article); 
      em.getTransaction().commit(); 
     } 
    } 

    private <T> void genericPersist(EntityManager em, Class<T> entity, String queryString) { 
     TypedQuery<T> query = em.createQuery(queryString, entity); 
     List<T> results = query.getResultList(); 
     if (isUniqueEntity(entity, results)) { 
      em.getTransaction().begin(); 
      em.persist(entity); 
      em.getTransaction().commit(); 
     } 
    } 

    private <T> boolean isUniqueEntity(Class<T> entity,List<T> results) { 
     return false; 
    } 

    private void persistNewsgroups(EntityManager em, Newsgroup newNewsgroup) { 
     LOG.fine(newNewsgroup.toString()); 
     TypedQuery<Newsgroup> query = em.createQuery("SELECT n FROM Newsgroup n", Newsgroup.class); 
     List<Newsgroup> results = query.getResultList(); 
     if (isUniqueNewsgroup(newNewsgroup, results)) { 
      em.getTransaction().begin(); 
      em.persist(newNewsgroup); 
      em.getTransaction().commit(); 
     } 
    } 

    private boolean isUniqueNewsgroup(Newsgroup newNewsgroup, Iterable<Newsgroup> results) { 
     LOG.fine(results.toString()); 
     for (Newsgroup existingNewsgroup : results) { 
      if ((existingNewsgroup.getNewsgroup().equals(newNewsgroup.getNewsgroup()))) { 
       return false; 
      } 
     } 
     LOG.fine(newNewsgroup + "\tnew"); 
     return true; 
    } 

    private List<Newsgroup> getFolders() { 
     List<Folder> folders = u.getFolders(); 
     List<Newsgroup> newsgroups = new ArrayList<>(); 
     for (Folder folder : folders) { 
      Newsgroup newsgroup = new Newsgroup(folder); 
      newsgroups.add(newsgroup); 
     } 
     LOG.fine(newsgroups.toString()); 
     return newsgroups; 
    } 
} 

對於isUniqueEntity所有我能想到的是確定物體的類型,然後使用交換機,但這似乎並沒有太大的積蓄。如何才能做到這一點?

假設實體有一個@Unique字段,請確定該字段,然後相應地查詢數據庫?

回答

1

嗯我不太確定 - 你是否試圖用和isUniqueNewsgroup替換isUniqueEntity?你能添加一些文章/ NewsGroup?如果你可以給它們添加一個接口,並且每個接口都有一個方法是的。如果你不能那麼大概你也可以做到這一點,但我不能這麼想:)

無論如何,你可以試試這個。接口添加到這兩個類:

public interface Equalable<T> { 
    boolean isEqual(T other); 
} 

private <T extends Equalable> boolean isUniqueEntity(T entity, Iterable<T> results) { 
    LOG.fine(results.toString()); 
    for (T resultEntity : results) { 
     if (resultEntity.isEqual(entity))) { 
      return false; 
     } 
    } 
    LOG.fine(newNewsgroup + "\tnew"); 
    return true; 
} 

然後在這兩個類的isEqual實現(T等)(只需複製粘貼現在在兩個isXUnique你的「如果」你的條件)。

如果這是你要找的人及工程(沒有編譯它!)的persist方法應該是你沒問題:)

+0

這就是我後要點,我就帶仔細看下來:) – Thufir 2012-07-31 07:46:44

+0

很酷,說如果你有任何其他問題。 – 2012-07-31 09:20:51