0

質問と問題は非常に単純ですが、面倒ですが、アプリケーション全体の問題であるため、グローバルな解決策を探しています。

以下のコードは本当に興味深いものではありませんが、明確にするために投稿します!

JPA 2.0 で PostgreSQL データベースを使用し、すべてのファサードとエンティティを生成しました。

問題は、すべてのエンティティにその子の Collection が含まれていることですが、これは (私たちにとってのみ?) children 要素の作成後に更新されません。オブジェクトはデータベースに書き込まれ、簡単に選択できますが、本当に見たいのは、親オブジェクトの子の更新されたコレクションです。

なぜこうなった?親のエンティティを (手動で) リフレッシュするem.refresh(parent)とうまくいきますが、Facades で多くの作業が必要になると思います。でも、もしかしたら他に方法がないのでしょうか?

ご支援ありがとうございます!

/* 編集 */

注釈の問題かキャッシュか何かに違いないと思いますが、すでに試しました

@OneToMany(mappedBy = "idquestion", orphanRemoval=true, fetch= FetchType.EAGER) 

@Cacheable(false)

正しく動作しませんでした。

/* 編集 */

理解のためのサンプルコード。

データベース レベル:

CREATE TABLE Question (
        idQuestion SERIAL,
        questionContent VARCHAR,    
    CONSTRAINT Question_idQuestion_PK PRIMARY KEY (idQuestion)
);

CREATE TABLE Answer (
        idAnswer SERIAL,
        answerContent VARCHAR,
        idQuestion INTEGER,
    CONSTRAINT Answer_idAnswer_PK PRIMARY KEY (idAnswer),
    CONSTRAINT Answer_idQuestion_FK FOREIGN KEY (idQuestion) REFERENCES Question(idQuestion)
);

Netbeans 7.1 でいくつかのエンティティを生成したよりも、それらはすべて次のようになります。

@Entity
@Table(name = "question", catalog = "jobfairdb", schema = "public")
@XmlRootElement
@NamedQueries({ BLAH BLAH BLAH...})
public class Question implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "idquestion", nullable = false)
    private Integer idquestion;
    @Size(max = 2147483647)
    @Column(name = "questioncontent", length = 2147483647)
    private String questioncontent;
    @OneToMany(mappedBy = "idquestion", orphanRemoval=true) 
    private Collection<Answer> answerCollection;

Getters... setters...

それらのために(再び)生成されたファサードを使用し、すべて次のAbstractFacadeように実装します。

public abstract class CCAbstractFacade<T> {
    private Class<T> entityClass;

    public CCAbstractFacade(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    protected abstract EntityManager getEntityManager();

    public void create(T entity) {
        getEntityManager().persist(entity);
    }
4

2 に答える 2

1

コンテナ管理のトランザクション を使用し、トランザクションの完了後にコレクションをフェッチする、親エンティティが自動的に更新されます。それ以外の場合は、コレクションを自分で更新する必要があります。

この記事では、この動作について詳しく説明しています: JPA 実装パターン: 双方向の関連付け

編集:

Container Managed Transaction を使用する最も簡単な方法はtransaction-type="JTA"Container-Managed Entity Managerpersistence.xmlを使用することです。

于 2012-09-05T14:48:54.107 に答える
0

あなたはManyToOne側を設定しているようですが、OneToManyに追加していないので、両方を行う必要があります。

JPAおよび一般的なJavaでは、双方向の関係の両側を更新する必要があります。そうしないと、オブジェクトの状態が同期されません。そうしないと、JPAだけでなく、Javaコードでも間違いになります。

JPAには、これを行う魔法はありません。EclipseLinkには、カスタマイザー(mapping.setRelationshipPartnerAttributeName())を介して設定できるこのための魔法のオプションがありますが、推奨されていません。コードを正しく修正することが最善の解決策です。

http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_sideを参照してください 。

于 2012-09-06T12:41:19.357 に答える