1

私はReverseMappingToolを使用して、既存のデータベーススキームのJPAソースを作成しています。

1つの例外を除いて、正常に機能します。作成後、get-Methodsを呼び出すと、1対多の関係からデータがロードされません。

JPAファイルは次のようになります。

@Entity
@Table(schema="myScheme", name="ORDER")
@IdClass(org.company.OrderId.class)
public class Order {
    @OneToMany(targetEntity=org.company.Orderposition.class, mappedBy="order", cascade=CascadeType.MERGE)
    private Set orderpositions = new HashSet();

public Set getOrderpositions() {
    return bestellpositions;
}

public void setOrderpositions(Set orderpositions) {
    this.orderpositions = orderpositions;
}

public Set getDependantPositions() {
    if (getOrderpositions() != null) {
        return getOrderpositions();
    }
}

と...

@Entity
@Table(schema="myScheme", name="ORDERPOSITION")
@IdClass(org.company.Orderposition.Id.class)
public class Orderposition {
    @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.MERGE)
    @JoinColumn(name="intid_strbestellung", nullable=false)
    private Order order;

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }

メソッド「getDependantPositions()」は、JPAクラス内に配置したメソッドの単なる例です。それが必要なので、与えられた通りに受け止めましょう。重要なのは、データベースにはこのオブジェクトのエントリが多数含まれているにもかかわらず、getOrderpositions()を呼び出してもデータが返されないということです。マッピングツールは@OneToMany-RelationshipsのFetchTypeを追加していません...そのため、LAZYを呼び出してgetOrderpositions()を呼び出すと、関連するすべての値が返されるはずです。

手伝って頂けますか?

ありがとう!

PS:それは私がthrReverseMappingToolを呼び出す方法です:

Options opts = new Options();
        // Output directory - All generated code and metadata will be written to the directory at this path
        opts.setProperty("directory", PATH_SOURCEGENERATION);
        // True to generate JPA annotations in generated java classes. 
        opts.setProperty("annotations", true);
        // disable orm.xml generation
        opts.setProperty("metadata", "none");
        // The full class name of a org.apache.openjpa.jdbc.meta.ReverseCustomizer customization plugin
        opts.setProperty("customizerClass", JPAPropertiesReverseCustomizer.name);
        // Create built-in application identity classes if possible
        opts.setProperty("useBuiltinIdentityClass", false);
        // Avoid creating classes for many-many join tables
        opts.setProperty("primaryKeyOnJoin", true);
        // Prevent the creation of inverse 1-many/1-1 relations for every many-1/1-1 relation detected
        opts.setProperty("inverseRelations", true);

        opts.setProperty("innerIdentityClasses", true);
4

2 に答える 2

2

どのクエリが DB に送信されるかを確認できるように、ログを構成する必要があります。次に、次のことを確認できます。1.Orderがロードされたときにどのクエリが DB に送信されるか、および 2. によって返される Set の内容を取得するときに、どのクエリが DB に送信されますかgetOrderpositions()Set のコンテンツにアクセスする必要があることに注意してください。getter を呼び出すだけでは、遅延ロードされた関連付けで DB クエリは呼び出されません。

于 2012-10-09T09:21:11.137 に答える
0

デフォルトの OneToMany Fetch Type は Lazy です。このデータをロードする場合は、JPQL ステートメントを使用する必要があります

SELECT t FROM TABLE t JOIN FETCH t.joinedTable

または、どこでも OneToMany マッピングで FetchType.EAGER を指定します。しかし、これはリレーションが常にロードされることを意味します。

例も参照してください: http://openjpa.apache.org/builds/1.1.0/docs/jpa_langref.html#jpa_langref_fetch_joins

セバスチャン

于 2012-10-09T09:09:51.157 に答える