SSH框架(Struct2+Spring3+Hivernate4)
有tel_type表(type,typename)\ tel_info(id,type,comName,comTel)
使用MyEclipse自动创建entity方式
public class TelType implements java.io.Serializable {
// Fields
private Integer id;
private Integer type;
private String typeName;
private Set<TelInfo> telInfos = new HashSet<TelInfo>(0);
//getset方法省略,注意下面fetch默认是 FetchType.LAZY,必须改成 FetchType.EAGER
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "telType" )
public Set<TelInfo> getTelInfos() {
return this.telInfos;
}
}
public class TelInfo implements java.io.Serializable {
// Fields
private Integer id;
private TelType telType;
private String companyName;
private String companyTel;
//省略getset方法
}
dao代码:
public List queryAll(){
List resultList = null;
session = getCurrentSession();
Query query = session.createQuery("FROM TelType");
resultList = query.list();
return resultList;
}
action代码:
public String query() throws Exception
{
TelService telService = (TelService)getBeanFromCurrentContext("TelService");
List<TelType> l = telService.queryAll();
getServletRequest().setAttribute("telPublicInfoList", l);
return "query";
}
jsp代码
<s:iterator value="#request.telPublicInfoList" id="TelType">
<th>
<s:property value="#TelType.typeName"/>
</th>
<th>
电话号码
</th>
<s:iterator value="#TelType.telInfos" id="telInfo">
<tr>
<td>
<s:property value="#telInfo.companyName" />
</td>
<td>
<s:property value="#telInfo.companyTel"/>
</td>
</tr>
</s:iterator>
</s:iterator>
如果是EAGER,那么表示取出这条数据时,它关联的数据也同时取出放入内存中
如果是LAZY,那么取出这条数据时,它关联的数据并不取出来,在同一个session中,什么时候要用,就什么时候取(再次访问数据库)。
但是,在session外,就不能再取了。用EAGER时,因为在内存里,所以在session外也可以取。
一般只在一边设Eager,JPA接口默认为一对多为Lazy,多对一为Eager,但是Hibernate反向工程生成Entity时,多对一为Lazy,需要手动改为Eager。