环境 hibernate4+springmvc4
我们创建hibernate实体经常有多对一的情况:
@Entity
@Table(name="test")
public class A{
@Id
private Long id;
@ManyToOne(targetEntity=B.class,fetch=FetchType.LAZY)
@JoinColumn(name="bId")
private B b;//节点主键
//....set get methods
}
于是乎我们程序上经常有这样的语句:
A a = (A)session.get(A.class,"123");
System.out.println(a.b.name);//B实体里有name属性
类似这样通过实体a获取b实体时,在debug时a的属性都能看到,但是b的属性在debug里都是null,但不影响正常取值。呵呵 这应该是hibernate缓存机制的原因
留心下,debug时不要错把它当成bug,不过因此debug时也挺烦人的,因为看不到属性,必须打印(
System.out.println();
)出来
测试发现,通过get、load、和createQuery方法都会这样.
解决方法:
fetch=FetchType.LAZY//延迟加载二级属性
改为
fetch=FetchType.EAGER//立即加载
这样debug就没刚才的问题了,但是通过hibernate日志你会发现,这样性能会下将的很快,因为一个业务请求获取某个属性并非也需要它全部二级或三级属性的值。