关于hibernate的懒加载

最近遇到一个懒加载的问题,请大家指教.

@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.谢谢.

   

你可能感兴趣的:(DAO,Hibernate,数据库,struts,user,null)