【问题标题】:EclipseLink persistence and refresh both association entitiesEclipseLink 持久化和刷新两个关联实体
【发布时间】:2012-06-13 11:10:59
【问题描述】:

我在我的 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;

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

提前感谢您的帮助!

【问题讨论】:

    标签: jpa persistence refresh eclipselink


    【解决方案1】:

    首先,如果您的代码正确,则不需要刷新。当您持久化分析时,如果它与项目相关,那么您应该以两种方式设置关系。我的猜测是你没有这样做。在 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

    【讨论】:

    • 感谢您的回答!确实,我在创建“分析”时将“项目”设置在“分析”中,但我没有将“分析”添加到“项目”中,因为我认为(我在某处读过)当“级联”注释正确时设置它是自动完成的......所以,也许不是?与此同时,我尝试在“getProject”函数中更改我的代码,我选择了正确的“projet”+刷新了“projet”,我得到了正确的结果(“分析”都在那里)。 .. 你听错了吗?再次感谢您的帮助!
    • 我也遇到了同样的问题,请问你是怎么解决的?
    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 2016-01-23
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2017-09-27
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多