2

「DocumentPersonCc」と1対多の関係にある「Document」というオブジェクトがあります。コード内のこれらのコレクションの1つ以上を変更しようとしていますが、Hibernateは予期したときに更新クエリを呼び出していません。通常のフィールド(ドキュメントの件名など)の1つを変更すると、更新クエリが呼び出されますが、それでもデータベース内の1対多の変更は保持されません。動作させるには何を変更する必要がありますか?

DocumentPersonCcのゲッターとセッター:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "document")
@LazyCollection(LazyCollectionOption.EXTRA)
@Sort(type = SortType.NATURAL, comparator = DocumentPersonCc.class)
public SortedSet<DocumentPersonCc> getDocumentPersonCcs() {
    return this.documentPersonCcs;
}

public void setDocumentPersonCcs(
        SortedSet<DocumentPersonCc> documentPersonCcs) {
    this.documentPersonCcs = documentPersonCcs;
}

更新コード:

public Document updateCcs(Document document) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    Document oldD = (Document) session.load(Document.class, document.getId());
    Hibernate.initialize(oldD.getDocumentPersonCcs());
    oldD.setDocumentPersonCcs(document.getDocumentPersonCcs());
    session.update(oldD);
    session.getTransaction().commit();
    document = this.returnDocument(document.getId());
    Hibernate.initialize(document.getDocumentPersonCcs());
    return document;
}

DocumentPersonCcのドキュメントゲッターとセッター:

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "DocumentsId", nullable = false, insertable = false, updatable = false)
protected Document getDocument() {
    return this.document;
}

public void setDocument(Document document) {
    this.document = document;
}
4

3 に答える 3

3

これを試して -

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "document")
@LazyCollection(LazyCollectionOption.EXTRA)
@Sort(type = SortType.NATURAL, comparator = DocumentPersonCc.class)
public SortedSet<DocumentPersonCc> getDocumentPersonCcs() {
    return this.documentPersonCcs;
}

カスケードを使用して子マッピングを更新します

于 2012-06-27T05:33:23.700 に答える
1

Documentエンティティクラスでカスケードを使用します。`

@OneToMany(fetch = FetchType.LAZY, mappedBy = "document")
@LazyCollection(LazyCollectionOption.EXTRA)
@Sort(type = SortType.NATURAL, comparator = DocumentPersonCc.class)
@Cascade({CascadeType.SAVE_UPDATE}) 
public SortedSet<DocumentPersonCc> getDocumentPersonCcs() {
    return this.documentPersonCcs;
}

`次に、ドキュメントエンティティを保存または更新するときに、コレクションを保存または更新するとき。

于 2012-06-27T05:24:50.707 に答える
0

Document.javaに、次のように1つのメソッドを追加します。

 public void addDocumentPersonCc(DocumentPersonCc documentPersonCc) {
    documentPersonCc.setDocument(this);
    documentPersonCcs.add(documentPersonCc);
 }

次に、updateCcsメソッドを次のように変更します

public Document updateCcs(Document document) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    Document oldD = (Document) session.load(Document.class, document.getId());
    Hibernate.initialize(oldD.getDocumentPersonCcs());
    SortedSet<DocumentPersonCc> documentPersonCcsList = document.getDocumentPersonCcs();
    //Iterate this documentPersonCcsList

    {
        // add oldD.addDocumentPersonCc(Value from Iterator);
    }    
    session.update(oldD);
    session.getTransaction().commit();
    document = this.returnDocument(document.getId());
    Hibernate.initialize(document.getDocumentPersonCcs());
    return document;
}
于 2012-06-27T05:48:30.810 に答える