Hibernate:无法初始化代理 - 没有Session(通过引用链......)

时间:2016-09-30 07:59:43

标签: java hibernate rest

注意:在任何人抱怨这是重复之前,请确保在不按标题判断的情况下浏览内容。另外,请务必仔细阅读您的参考问题和答案,看看它是否重复。根据我的经验,这个问题可以在不同的环境下发生。例如,使用jsp中的以下代码的人的答案会有所不同,因为使用Spring的人会有所不同,而对于数据库很小并且eager负载很好的人来说与众不同。不,我的情况不是他们中的任何一个。

我正在使用RESTHibernate撰写Jersey api。请看下面的代码。

VerificationCodeJSONService.java - JSON服务类

@Path("/verificaion_code")
public class VerificationCodeJSONService {

    @GET
    @Path("/getAllVerificationCodes")
    @Produces(MediaType.APPLICATION_JSON)
    public List<VerificaionCode> getAllVerificationCodes() {

        VerificationCodeService verificationCodeService=new VerificationCodeService();
        List<VerificaionCode> list = verificationCodeService.getAllVerificationCodes();
        return list;
    }
}

VerificationCodeService.java - 服务层

public class VerificationCodeService {    

    private static VerificationCodeDAOInterface verificationCodeDAOInterface;

    public VerificationCodeService() {
        verificationCodeDAOInterface = new VerificationCodeDAOImpl();
    }

    public List<VerificaionCode> getAllVerificationCodes() {
        Session session = verificationCodeDAOInterface.openCurrentSession();
        Transaction transaction = null;

        List<VerificaionCode> verificaionCodes = new ArrayList<VerificaionCode>();

        try {
            transaction = verificationCodeDAOInterface.openTransaction(session);
            verificaionCodes = verificationCodeDAOInterface.getAllVerificationCodes(session);
            transaction.commit();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            session.close();
        }

        return verificaionCodes;

    }
}

VerificationCodeDAOImpl.java - 数据库层

public class VerificationCodeDAOImpl implements VerificationCodeDAOInterface{

    private static final SessionFactoryBuilder sessionFactoryBuilder = SessionFactoryBuilder.getInstance();

    @Override
    public List<VerificaionCode> getAllVerificationCodes(Session session) {
        List<VerificaionCode> verificaionCodes=(List<VerificaionCode>)session.createQuery("from VerificaionCode").list();
        return verificaionCodes;
    }
}

VerificationCode.java - DAO图层

public class VerificaionCode implements java.io.Serializable {

    private Integer idverificaionCode;
    private Patient patient;
    private String code;
    private Date dateCreated;
    private Date lastUpdated;

    public VerificaionCode() {
    }

    public VerificaionCode(Patient patient, String code, Date lastUpdated) {
        this.patient = patient;
        this.code = code;
        this.lastUpdated = lastUpdated;
    }

    public VerificaionCode(Patient patient, String code, Date dateCreated, Date lastUpdated) {
        this.patient = patient;
        this.code = code;
        this.dateCreated = dateCreated;
        this.lastUpdated = lastUpdated;
    }

    public Integer getIdverificaionCode() {
        return this.idverificaionCode;
    }

    public void setIdverificaionCode(Integer idverificaionCode) {
        this.idverificaionCode = idverificaionCode;
    }

    public Patient getPatient() {
        return this.patient;
    }

    public void setPatient(Patient patient) {
        this.patient = patient;
    }

    public String getCode() {
        return this.code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public Date getDateCreated() {
        return this.dateCreated;
    }

    public void setDateCreated(Date dateCreated) {
        this.dateCreated = dateCreated;
    }

    public Date getLastUpdated() {
        return this.lastUpdated;
    }

    public void setLastUpdated(Date lastUpdated) {
        this.lastUpdated = lastUpdated;
    }

}

Patient.java - DAO图层

public class Patient  implements java.io.Serializable {

     private Integer idpatient;
     private DiabetesType diabetesType;
     private Language language;
     private String customId;
     private String diabetesOther;
     private String firstName;
     private String lastName;
     private String email;
     private Date dob;
     private String parentEmail;
     private String gender;
     private Date diagnosedDate;
     private Double height;
     private Double weight;
     private String heightUnit;
     private String weightUnit;
     private String theme;
     private String userName;
     private String password;
     private Date dateCreated;
     private Date lastUpdated;

    public Patient() {
    }


    public Patient(DiabetesType diabetesType, Language language, String customId, String firstName, String email, Date dob, String gender, String theme, String userName, String password, Date lastUpdated) {
        this.diabetesType = diabetesType;
        this.language = language;
        this.customId = customId;
        this.firstName = firstName;
        this.email = email;
        this.dob = dob;
        this.gender = gender;
        this.theme = theme;
        this.userName = userName;
        this.password = password;
        this.lastUpdated = lastUpdated;
    }

    public Integer getIdpatient() {
        return this.idpatient;
    }

    public void setIdpatient(Integer idpatient) {
        this.idpatient = idpatient;
    }
    public DiabetesType getDiabetesType() {
        return this.diabetesType;
    }

    public void setDiabetesType(DiabetesType diabetesType) {
        this.diabetesType = diabetesType;
    }
    public Language getLanguage() {
        return this.language;
    }

    public void setLanguage(Language language) {
        this.language = language;
    }
    public String getCustomId() {
        return this.customId;
    }

    public void setCustomId(String customId) {
        this.customId = customId;
    }
    public String getDiabetesOther() {
        return this.diabetesOther;
    }

    public void setDiabetesOther(String diabetesOther) {
        this.diabetesOther = diabetesOther;
    }
    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    public Date getDob() {
        return this.dob;
    }

    public void setDob(Date dob) {
        this.dob = dob;
    }
    public String getParentEmail() {
        return this.parentEmail;
    }

    public void setParentEmail(String parentEmail) {
        this.parentEmail = parentEmail;
    }
    public String getGender() {
        return this.gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
    public Date getDiagnosedDate() {
        return this.diagnosedDate;
    }

    public void setDiagnosedDate(Date diagnosedDate) {
        this.diagnosedDate = diagnosedDate;
    }
    public Double getHeight() {
        return this.height;
    }

    public void setHeight(Double height) {
        this.height = height;
    }
    public Double getWeight() {
        return this.weight;
    }

    public void setWeight(Double weight) {
        this.weight = weight;
    }
    public String getHeightUnit() {
        return this.heightUnit;
    }

    public void setHeightUnit(String heightUnit) {
        this.heightUnit = heightUnit;
    }
    public String getWeightUnit() {
        return this.weightUnit;
    }

    public void setWeightUnit(String weightUnit) {
        this.weightUnit = weightUnit;
    }
    public String getTheme() {
        return this.theme;
    }

    public void setTheme(String theme) {
        this.theme = theme;
    }
    public String getUserName() {
        return this.userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    public Date getDateCreated() {
        return this.dateCreated;
    }

    public void setDateCreated(Date dateCreated) {
        this.dateCreated = dateCreated;
    }
    public Date getLastUpdated() {
        return this.lastUpdated;
    }

    public void setLastUpdated(Date lastUpdated) {
        this.lastUpdated = lastUpdated;
    }
}

以下是我上述POJO的Hibernate映射文件

VerificaionCode.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 23, 2016 3:21:00 PM by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="beans.VerificaionCode" table="verificaion_code" catalog="myglukose" optimistic-lock="version">
        <id name="idverificaionCode" type="java.lang.Integer">
            <column name="idverificaion_code" />
            <generator class="identity" />
        </id>
        <many-to-one name="patient" class="beans.Patient" fetch="select">
            <column name="patient_idpatient" not-null="true" />
        </many-to-one>
        <property name="code" type="string">
            <column name="code" length="45" not-null="true" />
        </property>
        <property name="dateCreated" type="timestamp">
            <column name="date_created" length="19" />
        </property>
        <property name="lastUpdated" type="timestamp">
            <column name="last_updated" length="19" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

Patient.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Sep 23, 2016 3:21:00 PM by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="beans.Patient" table="patient" catalog="myglukose" optimistic-lock="version">
        <id name="idpatient" type="java.lang.Integer">
            <column name="idpatient" />
            <generator class="identity" />
        </id>
        <many-to-one name="diabetesType" class="beans.DiabetesType" fetch="select">
            <column name="diabetes_type_iddiabetes_type" not-null="true" />
        </many-to-one>
        <many-to-one name="language" class="beans.Language" fetch="select">
            <column name="language_idlanguage" not-null="true" />
        </many-to-one>
        <property name="customId" type="string">
            <column name="custom_id" length="45" not-null="true" />
        </property>
        <property name="diabetesOther" type="string">
            <column name="diabetes_other" length="45" />
        </property>
        <property name="firstName" type="string">
            <column name="first_name" length="100" not-null="true" />
        </property>
        <property name="lastName" type="string">
            <column name="last_name" length="100" />
        </property>
        <property name="email" type="string">
            <column name="email" length="45" not-null="true" />
        </property>
        <property name="dob" type="date">
            <column name="dob" length="10" not-null="true" />
        </property>
        <property name="parentEmail" type="string">
            <column name="parent_email" length="45" />
        </property>
        <property name="gender" type="string">
            <column name="gender" length="45" not-null="true" />
        </property>
        <property name="diagnosedDate" type="date">
            <column name="diagnosed_date" length="10" />
        </property>
        <property name="height" type="java.lang.Double">
            <column name="height" precision="22" scale="0" />
        </property>
        <property name="weight" type="java.lang.Double">
            <column name="weight" precision="22" scale="0" />
        </property>
        <property name="heightUnit" type="string">
            <column name="height_unit" length="45" />
        </property>
        <property name="weightUnit" type="string">
            <column name="weight_unit" length="45" />
        </property>
        <property name="theme" type="string">
            <column name="theme" length="45" not-null="true" />
        </property>
        <property name="userName" type="string">
            <column name="user_name" length="45" not-null="true" />
        </property>
        <property name="password" type="string">
            <column name="password" length="45" not-null="true" />
        </property>
        <property name="dateCreated" type="timestamp">
            <column name="date_created" length="19" />
        </property>
        <property name="lastUpdated" type="timestamp">
            <column name="last_updated" length="19" not-null="true">
                <comment>Stores the basic information of the patient</comment>
            </column>
        </property>        
    </class>
</hibernate-mapping>

但是当我通过http://localhost:8080/example_rest/rest/verificaion_code/getAllVerificationCodes运行此代码时,我收到以下错误。

could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->beans.VerificaionCode["patient"]->beans.Patient_$$_jvst40f_7["diabetesType"])  

正如您所见,diabetesType是患者表格中的Object(外键),与VerificationCode无关。我该如何解决这个问题?

请注意,这是REST API。所以我不能像在Web应用程序中那样在JSP中加载它们。

更新

正如@Kayaman推荐的那样,我通过null进行了更新。请检查以下代码。我注意到verificaionCodes.get(i).getPatient().set...(null)出现了与上面相同的错误,所以我尝试了下面开始正常工作。

VerificationCodeService.java

public List<VerificaionCode> getAllVerificationCodes() {
        Session session = verificationCodeDAOInterface.openCurrentSession();
        Transaction transaction = null;

        List<VerificaionCode> verificaionCodes = new ArrayList<VerificaionCode>();

        try {
            transaction = verificationCodeDAOInterface.openTransaction(session);
            verificaionCodes = verificationCodeDAOInterface.getAllVerificationCodes(session);

            transaction.commit();

        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            session.close();

            for(int i=0;i<verificaionCodes.size();i++)
            {
                Patient p = new Patient();

System.out.println(verificaionCodes.get(i).getPatient().getIdpatient());
                Integer idpatient = verificaionCodes.get(i).getPatient().getIdpatient();
                p.setIdpatient(idpatient);
                verificaionCodes.get(i).setPatient(p);
            }
        }

        return verificaionCodes;

    }

0 个答案:

没有答案