2012-06-13 55 views
1

我在使用PostgreSQL數據庫的Java EE項目中使用EclipseLink。 當我堅持/刷新屬於oneToMany/manytoOne關聯的實體時,我無法找到正確的註釋以獲得正確的行爲。EclipseLink持久性和刷新關聯實體

例如,我有一個實體「項目」,它首先由用戶通過UI創建。然後用戶可以將「分析」添加到他們創建的項目中。 因此,分析是一個項目的一部分,一個項目可以有多個分析。 堅持行動工作正常(我看到一個新的分析與我的數據庫中的項目相關聯),但是當我調用「getProject(idProject)」並顯示其分析列表時,我看不到刷新列表。

我該怎麼做?

目前的註解是:

在Projet.java

// bi-directional many-to-one association to Analyse 
    @OneToMany(mappedBy = "projet", cascade = { CascadeType.ALL }) 
    private Set<Analyse> analyses; 

在Analyse.java

//bi-directional many-to-one association to Projet 
@ManyToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH}) 
@JoinColumn(name="id_projet", nullable=false) 
private Projet projet; 

代碼堅持一個新的 「分析」:

public boolean insertAnalyse(Analyse analyse) { 
    System.out.println("insertAnalyse"); 
    boolean success = true; 
    fac = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT); 
    em = fac.createEntityManager(); 

    try { 
     em.getTransaction().begin(); 
     em.persist(analyse); 
      em.getTransaction().commit(); 
    } 

    catch (Exception ex) { 
     em.getTransaction().rollback(); 
     System.out.println("*** Erreur in MeansDAO. insertAnalyse() : " 
       + ex.getMessage()); 
     success = false; 

    } finally { 
     em.close(); 
    } 

    return success; 
} 

該代碼通過projectID檢索當前項目:

public Projet getProject(String p) { 
    System.out.println("getProject"); 
    Projet project = null; 

    fac = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT); 
    em = fac.createEntityManager(); 

    try { 
     em.getTransaction().begin(); 
     StringBuilder sql = new StringBuilder(); 

     Projet proj = em.find(Projet.class, Integer.parseInt(p)); 

     if (proj != null) { 
      project = proj; 
     } 

    } catch (Exception ex) { 
     em.getTransaction().rollback(); 
     System.out.println("*** Erreur in MeansDAO. getProject() : " 
       + ex.getMessage()); 
    } finally { 
     em.close(); 
    } 

    return project; 
} 

在此先感謝您的幫助!

回答

4

首先,如果你的代碼是正確的,你不需要刷新。當你堅持分析時,如果它與項目有關,那麼你應該雙向設置關係。我的猜測是你沒有這樣做。在JPA中,您負責正確維護您的關係。

見, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side

您所看到的關係失效狀態是(因爲你沒有保持雙方,也),因爲EclipseLink的默認維護一個共享緩存的原因。您可以禁用此,

見, http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

要使用刷新查詢提示刷新JPA的對象,你需要調用刷新()就可以了,或者執行一個查詢或找到()操作。

有關緩存看到更多的信息, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching

+1

謝謝您的回答!事實上,我在創建「分析」時已經設置了「projet」,但是我沒有將「分析」添加到「projet」中,因爲我認爲(我在某處讀到)當「級聯」註釋正確設置它自動完成...所以,也許不是?與此同時,我嘗試在「getProject」函數中更改我的代碼,並在「projet」中做了正確的「projet」+刷新選擇,我得到了正確的結果(「分析」都在那裏)。 ..這聽起來不對嗎?再次感謝你的幫助! – Coralie

+0

我面臨同樣的問題,PLZ可以解釋你如何解決? –