1

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

例如,我有一个实体“项目”,它首先由用户通过 UI 创建。然后用户可以将“分析”添加到他们创建的项目中。因此,分析是一个项目的一部分,一个项目可以有多个分析。持久操作工作正常(我在我的数据库中看到与项目关联的新分析)但是当我调用“getProject(idProject)”并显示其分析列表时,我看不到刷新的列表。

我该怎么做?

当前的注释是:

在 Projet.java 中

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

在分析.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

1 回答 1

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

于 2012-06-13T14:03:59.777 回答