当前位置: 代码迷 >> Java Web开发 >> hiberante延迟加载失效,该怎么处理
  详细解决方案

hiberante延迟加载失效,该怎么处理

热度:9794   发布时间:2016-04-10 23:31:52.0
hiberante延迟加载失效
    最近在学习hiberante,遇到了一个问题,关于一对一延迟加载失效的问题,到现在还没解决。以下是代码:Person.java
package org.javatribe.annotation.entity.onetoone;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;

import org.hibernate.annotations.GenericGenerator;
@Entity
public class Person implements Serializable
{
private static final long serialVersionUID = 1L;
private String id;
private String name;
private int age;
private IdCard idCard;
public Person()
{
}
public Person(String name, int age)
{
this.name = name;
this.age = age;
}
@Id
@GeneratedValue(generator="uuid")
@GenericGenerator(name="uuid",strategy="uuid")
public String getId()
{
return id;
}
public void setId(String id)
{
this.id = id;
}
@Column(length=20)
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
@OneToOne(optional=false,cascade={CascadeType.REMOVE,CascadeType.PERSIST},fetch=FetchType.LAZY)
@JoinColumn(name="idCard_id")
public IdCard getIdCard()
{
return idCard;
}
public void setIdCard(IdCard idCard)
{
this.idCard = idCard;
}
}

IdCard.java:
package org.javatribe.annotation.entity.onetoone;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.ForeignKey;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.LazyToOne;
import org.hibernate.annotations.LazyToOneOption;
import org.hibernate.annotations.Proxy;
/**
 * @author zxp
 * @datetime 2013-11-19 上午11:16:23
 * @description 身份证
 */
@Entity
public class IdCard implements Serializable
{
private String id;
private String idno;
private Person person;
public IdCard()
{
}
public IdCard(String idno)
{
this.idno = idno;
}
@Id
@GeneratedValue(generator="uuid")
@GenericGenerator(name="uuid",strategy="uuid")
public String getId()
{
return id;
}
public void setId(String id)
{
this.id = id;
}
@Column(length=20)
public String getIdno()
{
return idno;
}
public void setIdno(String idno)
{
this.idno = idno;
}
public void setPerson(Person person)
{
this.person = person;
}
@OneToOne(mappedBy="idCard",optional=false,fetch=FetchType.LAZY)
//@LazyToOne(LazyToOneOption.PROXY)
public Person getPerson()
{
return person;
}
}

    以下是测试代码:
public class OneToOneTest1
{
 public static void main(String[] args)
{
Session session=HibernateSessionFactory.getSession();
Transaction tx=null;
try
{
tx=session.beginTransaction();
//新增记录到数据库中
/*IdCard idCard=new IdCard("10010");
Person person=new Person("zhansan",22);
person.setIdCard(idCard);
idCard.setPerson(person);
session.persist(person);*/
//Person person=(Person) session.get(Person.class, "402881ed42698c2b0142698c338a0001");
//根据主键来查询被关联端IdCard
IdCard idCard=(IdCard)session.get(IdCard.class, "402881ed4269c0bd014269c0c1310002");
// System.out.println(idCard.getIdno());
tx.commit();
}catch(Exception ex)
{
if(tx!=null)
{
tx.rollback();
}
ex.printStackTrace();
}finally
{
if(session!=null)
{
HibernateSessionFactory.closeSession();
}
}
}
}

    运行结果,发现执行的SQL语句有两句:

    有点不是很明白,我明明已经在被维护端设置了懒加载fetch=FetchType.LAZY,可是最后还是失效。昨天查了以下,看到一片帖子:http://blog.csdn.net/zgmzyr/article/details/5882073,照帖子讲解,应该是查询IdCard的时候hiberante没有给其对应的Person生成代理对象,而是直接查询了Person的内容,导致懒加载失效,解决办法是在IdCard类中给其对应的Person加一个注解属性optional=false,这样Hiberante就会知道该IdCard对应的Person不能为空,因此会生成代理对象。可是亲测了一下,还是不行,懒加载还是失效,查询过程中还是会将Person一起查出来,不过我还是相信,应该就是生成代理对象失败的原因导致,之后我又查了hibernate的注解文档,加了其他注解试了一下,比如@LazyToOne(LazyToOneOption.PROXY),结果还是出现懒加载失效的问题。到现在问题还没解决,希望哪位同学知道的指导一下!谢谢!