Java Hibernate:无法初始化代理-无会话(通过引用链…)

Java Hibernate:无法初始化代理-无会话(通过引用链…),java,hibernate,rest,Java,Hibernate,Rest,注意:在任何人抱怨这是重复之前,请确保仔细阅读内容,不要根据标题来判断。还要确保仔细阅读你的参考问题和答案,看它是否重复。根据我现在的经验,这个问题可能在不同的环境下发生。例如,对于在jsp中使用以下代码的人来说,答案将不同;对于使用Spring的人来说,答案将不同;对于DB较小且渴望加载的人来说,答案将不同。不,我的情况不是他们中的任何一个 我正在使用Hibernate和Jersey编写一个RESTapi。请看下面的代码 VerificationCodeJSONService.java-JS

注意:在任何人抱怨这是重复之前,请确保仔细阅读内容,不要根据标题来判断。还要确保仔细阅读你的参考问题和答案,看它是否重复。根据我现在的经验,这个问题可能在不同的环境下发生。例如,对于在
jsp
中使用以下代码的人来说,答案将不同;对于使用
Spring
的人来说,答案将不同;对于DB较小且
渴望加载的人来说,答案将不同。不,我的情况不是他们中的任何一个


我正在使用
Hibernate
Jersey
编写一个
REST
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;
    }
}
Patient.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;
    }

}
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
映射文件

验证代码.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>
<?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>
如您所见,
diabetepe
是患者表中的一个
对象
(外键),与
验证代码
无关。我怎样才能解决这个问题

请注意,这是一个
REST
API。所以我不能像在web应用程序中那样在JSP中加载这些


更新

按照@Kayaman的建议,我通过设置
null
来进行更新。请检查下面的代码。我注意到,
VerificationCodes.get(I).getPatient().set…(null)
会产生与上面相同的错误,因此我尝试了下面的方法,该方法开始正常工作

VerificationCodeDevice.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;

    }
public List getAllVerificationCodes(){
会话会话=verificationCodeDAOInterface.openCurrentSession();
事务=空;
List VerificationCodes=new ArrayList();
试一试{
事务=verificationCodeDAOInterface.openTransaction(会话);
VerificationCodes=verificationCodeDAOInterface.getAllVerificationCodes(会话);
commit();
}捕获(例外情况除外){
例如printStackTrace();
}最后{
session.close();

对于(int i=0;i@Kayaman:也许,你知道在特定情况下如何解决这个问题吗?也许。但是既然你不愿意诚实地回答我,我为什么要帮助你?@Kayaman:我没有请求你来帮助。这是你是否愿意帮助的问题。如果你不想帮助,那也没关系。另外,你问我是否知道潜在的问题或问题问题结束???@Kayaman:哦,嗯,好吧..这很奇怪。代码中绝对没有空的东西(据我所知,也许我错了)。请问您对此有何建议?internet上似乎没有解决此问题的解决方案,不知道是否有人使用Hibernate来做一些与Web ViewNo不同的事情。我的意思是,它与
NPE
一样常见,而且只有一个原因。您需要在会话打开时初始化代理。您声称无法执行我渴望获取,这是为什么?而且这与JSP、web或其他类似的东西无关。这是一个纯粹的基本Hibernate东西。为什么不在查询中执行渴望获取?
<?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>
could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->beans.VerificaionCode["patient"]->beans.Patient_$$_jvst40f_7["diabetesType"])  
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;

    }