1対多くの双方向のパフォーマンスの問題
-
27-10-2019 - |
質問
私には疑いがあります、それは私たちが作成するときです 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;
....
....
}
address.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 子供のクラスです。データベースから親オブジェクトを取得すると、子のクラスがロードされています。それは結構です。問題はありません。
しかし、その逆では、つまり。私たちが子供のクラスをフェッチしている場合、それも親クラスを保持しています (人).
例:アドレスIDでアドレスを取得します。データベースから100のアドレスを取得したと仮定してください。
ただし、アドレスクラスで 人 変数は、親(人)オブジェクトAsloを保持します。
私の疑いはここにあります
使用されています 異なる100メモリ 人の。同じデータで。の アドレスクラス。 ?
私のダオはこんな感じです。
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 ....および99あたり 同じメモリまたは異なるものを使用しています。
同じ場合、それは大丈夫です。それ以外の場合、それはより多くのメモリ利用の実行の問題を引き起こす可能性があります。
plsを助けます...
解決
hibernateはアイデンティティチェックを行います。 1つのHibernateセッションには、同じIDを持つオブジェクトの単一インスタンスのみが含まれています。したがって、PER、PER1、... PER99が1人の場合、1つのオブジェクトがあります。それ以外の場合 - 異なるオブジェクト。
所属していません StackOverflow