2012-06-13 2 views
1

Java EE 프로젝트에서 PostgreSQL 데이터베이스와 함께 EclipseLink를 사용하고 있습니다. oneToMany/manytoOn 연관의 일부인 엔티티를 유지/새로 고침 할 때 올바른 동작을위한 올바른 주석을 찾는 데 어려움이 있습니다.EclipseLink 지속성 및 새로 고치기 두 연관 엔티티

예를 들어 UI를 통해 사용자가 처음 만든 엔티티 "프로젝트"가 있습니다. 그런 다음 사용자는 자신이 만든 프로젝트에 "분석"을 추가 할 수 있습니다. 따라서 분석은 하나의 프로젝트의 일부이며 프로젝트는 여러 가지 분석을 수행 할 수 있습니다. 지속 작업이 잘 작동합니다 (데이터베이스의 프로젝트와 관련된 새 분석이 표시됨).하지만 "getProject (idProject)"를 호출하고 분석 목록을 표시하면 새로 고침 된 목록을 볼 수 없습니다.

어떻게해야합니까?

현재 주석은 다음과 같습니다

// 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; 

코드에서 Projet.java에서 새로운는 "분석"지속 :

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; 
} 

코드 프로젝트 ID별로 현재 프로젝트를 검색하는 방법 :

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는 기본적으로 공유 캐시를 유지하기 때문에 당신이 (당신이 양쪽을 유지하지 않았기 때문에, 또한) 관계의 부실 상태는보고있다. 당신은 새로 고침 쿼리 힌트를 사용하여 당신이 그것에() 새로 고침 전화하거나 쿼리를 실행하거나 찾을 필요가 JPA에서 개체() 작업을 새로 고치려면

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

을이 사용하지 않도록 설정할 수 있습니다. 캐싱 참조에 대한 자세한 내용은

, 답변에 대한 http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching

+1

감사합니다! 사실, 나는 그것이 만들어 질 때 "분석"안에 "projet"을 설정했지만 "계단식 (cascade)"주석이 적당 할 때 (나는 그것을 어딘가에서 읽었다) 생각하기 때문에 "분석"을 "projet"에 추가하지 않는다. 그것을 자동으로 설정 했어 ... 그럼, 아닐 수도 있니? 그 동안 "getProject"함수에서 코드를 변경하려고 시도했으며 올바른 "projet"+ "projet"의 새로 고침을 선택하고 올바른 결과를 얻었습니다 ("분석"이 모두 있습니다). .. 너 한테 잘못한 소리 야? 도와 주셔서 다시 한 번 감사드립니다! – Coralie

+0

나는 똑같은 문제에 직면하고있다. plz는 어떻게 해결할 수 있을까? –

관련 문제