我有兩個模型:Ordine 和 DettaglioOrdine。我希望這樣,當我保存“Ordine”型別的物件時,hibernate 也會保存他的孩子“DettaglioOrdine”(這很有效)。但是,如果我做一個選擇查詢,查詢非常非常慢,因為休眠檢索也 DettaglioOrdine。所以,我想要沒有“DettaglioOrdine”物件的“Ordine”物件。
“秩序”模型:
@Entity
@Table(name="ordini")
@NamedQuery(name="Ordine.findAll", query="SELECT o FROM Ordine o")
public class Ordine extends DataObject<Integer> {
private static final long serialVersionUID = 1L;
private Integer id;
[...]
private List<Dettagliordine> dettagliordine;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique=true, nullable=false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
//bi-directional many-to-one association to Dettagliordine
@Column(insertable = true, updatable = true)
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="ordine")
public List<Dettagliordine> getDettagliordine() {
return this.dettagliordine;
}
public void setDettagliordine(List<Dettagliordine> dettagliordine) {
this.dettagliordine = dettagliordine;
}
public Dettagliordine addDettagliordine(Dettagliordine dettaglioordine) {
dettaglioordine.setOrdine(this);
this.dettagliordine.add(dettaglioordine);
return dettaglioordine;
}
public Dettagliordine removeDettagliordine(Dettagliordine dettagliordine) {
dettagliordine.setOrdine(null);
this.dettagliordine.remove(dettagliordine);
return dettagliordine;
}
}
DettaglioOrdine 型號:
@Entity
@Table(name="dettagliordine")
@NamedQuery(name="Dettagliordine.findAll", query="SELECT d FROM Dettagliordine d")
public class Dettagliordine extends DataObject<Integer> {
private static final long serialVersionUID = 1L;
private Integer id;
[...]
public Dettagliordine() {
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique=true, nullable=false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
[...]
//bi-directional many-to-one association to Ordini
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="idOrdine", nullable=false)
public Ordine getOrdine() {
return this.ordine;
}
public void setOrdine(Ordine ordine) {
this.ordine = ordine;
}
}
這是我的查詢:
SessionFactory sessionFactory = getSessionFactory();
Session session = sessionFactory.getCurrentSession();
List<OrdineDTO> result = null;
try{
String hql = "select d.ordine from Dettagliordine d "
"group by d.ordine.id";
Query<Ordine> query = session.createQuery(hql,Ordine.class);
List<Ordine> res = query.getResultList();
result = new OrdineDMO().unmarshall(res);
}catch (DMOException e) {
e.printStackTrace();
}
uj5u.com熱心網友回復:
它不是休眠。你fetch=FetchType.LAZY有dettagliordine. Hibernate 不必獲取與父級的惰性關聯。
問題可能在這里
result = new OrdineDMO().unmarshall(res);
如果unmarshall()方法內部的代碼接觸dettagliordine或呼叫了一個不同于 get、set 方法(如toString()方法)的方法,Hibernate 將獲取dettagliordine關聯。
您可以啟用 Hibernate 日志記錄并除錯代碼。您將看到實際發生提取的時間。還要記住,如果您除錯持久類,除錯器可能會導致toString()方法呼叫,并且關聯也會被獲取。
最好將此行移到 session/@Transactional 代碼塊之外。
result = new OrdineDMO().unmarshall(res);
您將擁有LazyInitializationExcepton對惰性關聯的任何不需要的訪問權限。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/461308.html
下一篇:JPA獲取外鍵而不加載相關記錄
