最近遇到一个懒加载的问题,请大家指教.
@Entity @Table(name="tb_user") public class User implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="USER_ID") private Long userId = null;//主键 @ManyToOne(fetch=FetchType.LAZY)//注意,此处设为lazy @JoinColumn(name="ORG_ID") private Organize org=null;//机构 @Transient private Long orgId;//用于查询,组织id // 其他与机构无关属性及 getter/setter 方法 } @Entity @Table(name="tb_org") public class Organize implements Serializable{ @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="ORG_ID") private Long orgId = null; //还有其他与user无关属性以及他们的get/set方法 }add.jsp 添加页面传参方法如下 <input type="hidden" name="user.org.orgId" value="${orgId }"/>⑧ action中 userService.addUser(user); 直接保存user对象 这个时候,我能添加,不出任何问题,数据库里org_id字段确实存在值.但是当我查询的时候问题发生了.user.getOrg为空.代码如下 user = userService.getUserById(su.getUserId());//此处的user确实能查出数据来,但是org为空, ① User u = new User(); u.setOrg(user.getOrg());此处通过调用get方法得org,依然为空②
我的问题是明明我数据库里有值,但是②处却查不出来,我很奇怪.①处查不出来是因为实体类中的加载机制为懒加载.没有显式调用,不会加载.但是②处我调用get方法了为什么还查不出来???请大家指教.
鉴于以上问题.我更改了页面传参方式
<input type="hidden" name="orgId" value="${orgId }"/> 注:struts2框架.action中定义了一个叫orgId的变量 private Long orgId = null; // 添加用户时,用户选择的机构 保存代码改为 if(orgId!= null&&!"".equals(orgId)){ Organize org = new Organize(); org.setOrgId(user.getOrgId());//显式的调用了set方法③ user.setOrg(org); } userService.addUser(user); 这样,我也能将数据入库. 当我这样查询user的时候 user = userService.getUserById(su.getUserId());// ④ User u = new User(); u.setOrg(user.getOrg());⑤ userList = userService.queryUser(u);
根据debug显示的结果,④处能够查询出user对象,⑤处显式的调用get方法依然为null,而且没有进行数据库查询,但是却将值传给U了.而且当且仅当dao层拼接hql语句的时候才真正的去数据库查询. 我个人的理解是,当我封装参数的时候,懒加载机制只是记录了这里set值了,并没有真的去数据库查询.但是当我拼接sql时,这时候是真正的需要这个参数值,他才会去数据库查询.由于⑧处我是将值直接保存进去的,并没有显式的调用set方法,所以get的时候就没有值.但是③处我显式的电影了set方法,当get时有值. 当然,我自己都觉得这么说很牵强.希望能有高手告诉我为什么一开始我那种写法dao层认为我的user.getOrg是null.谢谢.