1

PostgreSQLデータベースを使用するJavaEEプロジェクトでEclipseLinkを使用しています。oneToMany / manytoOneアソシエーションの一部であるエンティティを永続化/更新すると、正しい動作のための適切な注釈を見つけるのに問題があります。

たとえば、UIを介してユーザーが最初に作成するエンティティ「Project」があります。次に、ユーザーは作成したプロジェクトに「分析」を追加できます。したがって、分析は1つのプロジェクトの一部であり、プロジェクトには複数の分析を含めることができます。永続化アクションは正常に機能しますが(データベースにプロジェクトに関連付けられた新しい分析が表示されます)、「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

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 に答える