0

次のクラスを検討してください。このクラスは、OneToMany 関係Parentでクラスのリストを保持し ます。Child双方向の関係を確立したい場合は、親の子のリストに子を追加し、親を子に設定する必要があります。

親の子リストに子を追加するには、最初にすべての子のリストをロードする必要があります。子のリストが大きく、実際には子を必要としない場合、これは大きなオーバーヘッドになると思います。

サンプルコードを見てください。それを最適化できますか、それとも JPA はその種の操作の最適化に組み込まれていますか?

この例では EntityManager コードをスキップしましたが、コードが何をすべきかは明らかだと思います。

これはChildクラスです:

@Entity
public class Child {

    Parent parent;

    @ManyToOne
    public Parent getParent() {
        return parent;
    }

    public void setParent(Parent parent) {
        this.parent = parent;
    }
}

これはParentクラスです:

@Entity
public class Parent {


    List<Child> children;

    @OneToMany(mappedBy = "parent")
    public List<Child> getChildren() {
        return children;
    }

    public void setChildren(List<Child> children) {
        this.children = children;
    }
}

そして、このクラスは双方向の関係を設定します。

public class Tester {


    public static void main(String[] args) {

        // in a real application i would load that from the 
        // DB and it would maybe have already a lot of children
        Parent parent = new Parent(); 
        Child child = new Child(); //

        // Set bidirectional relation
        // Isn't this line a lot of overhead -> need to load all the children just to add an additional one?
        parent.getChildren().add(child); 
        child.setParent(parent);
    }
}
4

2 に答える 2

2

関連付けの反対側を設定する必要はありませんこのコレクションがすでにロードされている場合、またはフラッシュが完了する前にロードされた場合、一貫性のない状態になることに注意する必要があります。

しかし、多くの場合、トランザクションで何もせずに子を親に追加するだけであり、この場合、コレクションを更新しても意味がありません。

コレクションが非常に大きい場合は、関連付けを双方向にするべきではありません。

于 2013-07-24T21:45:08.560 に答える