13

の例を試しfetchType.Lazyていますが、コードのデバッグ中にfetchType.Lazy動作していないようです。

エンティティ Bean: アドレス

地区フィールドにプロパティ fetch=fetchType.Lazy を持つアノテーション @Basic を追加しました。

私のエンティティ Bean は、以下のコードで定義されています。

    package model;

    import java.io.Serializable;
    import javax.persistence.*;
    import java.util.List;


    /**
     * The persistent class for the address database table.
     */
    @Entity
    @Table(name="address", schema="home")
    public class Address implements Serializable {
        private static final long serialVersionUID = 1L;

        @TableGenerator(name = "addr_gen", table = "table_generator", pkColumnName = "gen_name", valueColumnName = "gen_val", allocationSize=1)
        @Id
        @GeneratedValue(strategy=GenerationType.TABLE, generator="addr_gen")
        private String addressId;

        private String city;

        @Basic(fetch=FetchType.LAZY)
        @Column(name="district")
        private String district;

        private String houseNumber;

        private String pincode;

        private String state;

        private String street;

        //bi-directional many-to-one association to Employee
        @OneToMany(mappedBy="address")
        private List<Employee> employees;

        public Address() {
        }


        public String getAddressId() {
            return this.addressId;
        }

        public void setAddressId(String addressId) {
            this.addressId = addressId;
        }

        public String getCity() {
            return this.city;
        }

        public void setCity(String city) {
            this.city = city;
        }

        public String getDistrict() {
            return this.district;
        }

        public void setDistrict(String district) {
            this.district = district;
        }

        public String getHouseNumber() {
            return this.houseNumber;
        }

        public void setHouseNumber(String houseNumber) {
            this.houseNumber = houseNumber;
        }

        public String getPincode() {
            return this.pincode;
        }

        public void setPincode(String pincode) {
            this.pincode = pincode;
        }

        public String getState() {
            return this.state;
        }

        public void setState(String state) {
            this.state = state;
        }

        public String getStreet() {
            return this.street;
        }

        public void setStreet(String street) {
            this.street = street;
        }

        public List<Employee> getEmployees() {
            return this.employees;
        }

        public void setEmployees(List<Employee> employees) {
            this.employees = employees;
        }


        public Employee addEmployees(Employee employees) {
            getEmployees().add(employees);
            employees.setAddress(this);

            return employees;
        }

        public Employee removeEmployees(Employee employees) {
            getEmployees().remove(employees);
            employees.setAddress(null);

            return employees;
        }

        /*@Override
        public String toString() {
            return "Address [addressId=" + addressId + ", city=" + city
                    + ", district=" + district + ", houseNumber=" + houseNumber
                    + ", pincode=" + pincode + ", state=" + state + ", street="
                    + street + ", employees=" + employees + "]";
        }*/
    }

上記のエンティティ Bean を使用する方法:

public Address findAddress(EntityManagerFactory emf, UserTransaction tx) {
    EntityManager em = emf.createEntityManager();
    Address addr = null;
    try {
        tx.begin();
        addr = em.find(Address.class, new String("154"));
        tx.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return addr;
}

そのため、メソッド呼び出しの後、find住所オブジェクトを調べたところ、すでに地区フィールドが入力されていました。

構成が不足しているかどうか、またはコード自体に問題があるかどうかをお知らせください。

4

3 に答える 3

13

問題は、@Basicアノテーションで使用する場合、アプリケーションサーバーがデータをフェッチする方が良い場合を独自に決定できる/可能性があることです。ここに文書化されているように

EAGER戦略は、値を積極的に取得する必要がある永続化プロバイダー ランタイムの要件です。LAZY戦略は、持続性プロバイダーのランタイムへのヒントです。

@OneToManyのような注釈には、ドキュメントによると同じ問題がありますが、その場合、JPA プロバイダーが FetchType ヒントを考慮する可能性が高くなります。

一方、次のようなビッグデータフィールドを試すことができます

@Lob
@Basic(fetch=FetchType.LAZY)
private byte[] document;

何かが変更されたかどうかを確認します (ただし、アプリケーション サーバーは常にフィールドをフェッチすることを決定できます)。

コレクション フィールドが読み込まれたかどうかを確認するには、データベース クエリ ログを確認するか、次の手順を実行します。

@PersistenceContext private EntityManager em;
.....
Person person = em.find(Person.class, 1L);//Person entity has a OneToMany relationship to entity Address
em.detach(person);
person.getAddresses().size();//if the Address are now not fetched, it the call should  throw an error
于 2013-09-09T08:11:48.123 に答える
0

JPA で laze を初期化するには、jar ライブラリを呼び出して開始する必要があります。maven または manual port example を使用している場合は、laze が必要な場合は、maven jar で jar を使用します de.empulse.eclipselink 詳細情報http://wiki. eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Performance/Weaving/Static_Weaving#Use_the_Maven_plugin

maven を使用しない場合は、jar を手動で有効にすることができます

于 2017-05-09T16:05:24.057 に答える