建議在一多對關聯中在"一"方用延遲加載"多"方
可以在HQL中顯式的"迫切左外連接" left join fetch
這樣做Hibernate可以少訪問數據庫,也可以用"@BatchSize(size = 5)"來減少訪問數據庫的次數
User.java 一方
@Entity
@Table(name = "tbl_user")
@org.hibernate.annotations.Entity(dynamicUpdate=true,dynamicInsert=true)
public class User implements Serializable{
@Id
@GeneratedValue(generator="gen")
@GenericGenerator(name="gen",strategy="increment")
@Column(name="id")
private Integer id;
/**
* username
*/
@Column(name="username", length=50, insertable = true, updatable = true, nullable = false)
private String username;
/**
* password
*/
@Column(name="password", length=20, insertable = true, updatable = true, nullable = false)
private String password;
/**
* 創建時間
*/
@Column(name="createtime")
@Temporal(value=TemporalType.TIMESTAMP)
private Date createtime;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy = "user")
@BatchSize(size = 5)
private Set<Order> orders=new HashSet<Order>();
/**
* 省略get,set方法
*/
}
Order.java 多方
@Entity
@Table(name = "tbl_order")
@org.hibernate.annotations.Entity(dynamicUpdate=true,dynamicInsert=true)
public class Order implements Serializable{
/**
* id
*/
@Id
@GeneratedValue(generator="gen")
@GenericGenerator(name="gen",strategy="increment")
@Column(name="id")
private Integer id;
/**
* orderNum
*/
@Column(name="orderNum", length=50, insertable = true, updatable = true, nullable = false)
private String orderNum;
/**
* 創建時間
*/
@Column(name="createtime")
@Temporal(value=TemporalType.TIMESTAMP)
private Date createtime;
@ManyToOne
@JoinColumn(name = "userId")
private User user;
/**
* 省略get,set方法
*/
}
UseerDaoImpl.java中部分代碼
public List<User> listUser(){
List<User> list=this.getHibernateTemplate().find(" from User as u left join fetch u.orders ");
return list;
}