EclipseLink持久化并刷新两个关联实体

时间:2012-06-13 11:10:59

标签: jpa persistence refresh eclipselink

我在我的Java EE项目中使用EclipseLink和PostgreSQL数据库。 当我持久化/刷新属于oneToMany / manytoOne关联的实体时,我很难找到正确行为的正确注释。

例如,我有一个实体“Project”,它首先由用户通过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;
}

提前感谢您的帮助!

1 个答案:

答案 0 :(得分: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中刷新对象,您需要在其上调用refresh(),或使用刷新查询提示执行Query或find()操作。

有关缓存的更多信息,请参阅 http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching