0

1 つ疑問があります。それは、1 対多を双方向として作成する場合です。子クラスに 1 つの親クラス参照を配置します。

コードを参照してください。

Person.java

@Entity
@Table(name="PERSON")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="personId")
     private int id;
    @Column(name="personName")
    private String name;
    @OneToMany(cascade =CascadeType.ALL,fetch = FetchType.LAZY)
    @JoinColumn(name="personId") 
    private Set <Address> addresses;
         ....
         ....
}

アドレス.java

@Entity
@Table(name = "ADDRESS")
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "addressId")
    private int id;
    @Column(name = "address",nullable=false)
    private String address;
    @ManyToOne(cascade =CascadeType.ALL)
    @JoinColumn(name="personId",nullable=false)
    private Person person;
           ....
           ....
    }

ここでPerson.javaは親クラスで、Address.javaは子クラスです。データベースから親オブジェクトを取得すると、子クラスがロードされます。それは結構です。問題ありません。

しかし、その逆です。子クラスを取得している場合は、親クラス(person)も保持しています。

例: アドレス ID で Address をフェッチします。データベースから 100 件の住所を取得したと仮定します。

しかし、アドレス クラスのperson変数では、親 (Person) オブジェクトも保持します。

私の疑問はここにあります

人によって使い分けられる100個のメモリー です。同じデータで。Address クラスで。?

私のダオはこんな感じです。

public List<Address> getAllAddressByPersonId(int personId) {
        List<Address> addressList =  null;
        try {
            DetachedCriteria criteria = DetachedCriteria.forClass(Address.class);
            criteria.createCriteria("person").add(Restrictions.eq("id", personId));
            addressList = getHibernateTemplate().findByCriteria(criteria);
        } catch (HibernateException e) {
            e.printStackTrace();
        } catch (DataAccessException e) {
            e.printStackTrace();
        }

        return addressList;

addrssList のサイズが 100 であると仮定します。

お気に入り

per =  addressList.get(0).getPerson() , 

per 1 = addressList.get(1).getPerson(),

per2 = addressList.get(2).getPerson(),

....

per99 =  addressList.get(99).getPerson(). 

ここで、per1、per2 .... および per 99は同じメモリを使用しているか、異なるメモリを使用しています。

同じ場合は問題ありません..そうでない場合、メモリ使用率が高くなるという問題が発生する可能性があります.?

助けてください...

4

1 に答える 1

0

Hibernate は ID チェックを行います。1 つの Hibernate セッションには、同じ ID を持つオブジェクトのインスタンスが 1 つだけ含まれます。したがって、per、per1、...per99 が 1 人である場合、そのオブジェクトは 1 つになります。そうでなければ - 別のオブジェクト。

于 2011-10-20T13:25:43.313 に答える