org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话 -

Posted

技术标签:

【中文标题】org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话 -【英文标题】:org.hibernate.LazyInitializationException: could not initialize proxy - no Session – 【发布时间】:2019-05-10 05:32:39 【问题描述】:

我的休眠代码有错误,我需要知道如何修复它

错误:

"errorMessage": "无法初始化代理 [tech.basarsoft.hayez.io.entity.University#GX8QcPIfNySrLRIPzmTGRT1qIFuYB8] - 没有会话”,

CollageEntryPOint 类

@Path("/collage")

public class CollageEntryPoint 

    @Autowired
    CollageService collageService;

    @Secured
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
    public CollageResponseRest create(CollageRequestModel requestObject) 
        CollageResponseRest returnValue = new CollageResponseRest();
        // Prepare UserDTO
        CollageDTO collageDTO = new CollageDTO();

        BeanUtils.copyProperties(requestObject, collageDTO);

//        // Create new user 
        CollageDTO createdRecord = collageService.create(collageDTO);

//        //Prepare response
        BeanUtils.copyProperties(createdRecord, returnValue);

        return returnValue;
    

    @Secured
    @GET
    @Path("/id")
    @Produces(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
    public CollageResponseRest get(@PathParam("id") String id) 
        CollageResponseRest returnValue = null;

        CollageDTO cdto = collageService.get(id);

        returnValue = new CollageResponseRest();
        BeanUtils.copyProperties(cdto, returnValue);

        return returnValue;
    


    @Secured
    @GET
    @Transactional
    @Produces(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
    public List<CollageResponseRest> getAll(@DefaultValue("0") @QueryParam("start") int start,
            @DefaultValue("999999999") @QueryParam("limit") int limit) 

        List<CollageDTO> collageDTOs = collageService.getAll(start, limit);

        // Prepare return value 
        List<CollageResponseRest> returnValue = new ArrayList<CollageResponseRest>();
        for (CollageDTO collageDTO : collageDTOs) 
            CollageResponseRest RestModel = new CollageResponseRest();
            BeanUtils.copyProperties(collageDTO, RestModel);
            RestModel.setHref("/hayez/api/collage/" + collageDTO.getId());
            returnValue.add(RestModel);
        

        return returnValue;
    

    @Secured
    @PUT
    @Path("/id")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
    public CollageResponseRest update(@PathParam("id") String id,
            CollageRequestModel details) 
        // Prepare UserDTO

        CollageDTO storedDetails = collageService.get(id);

        // Set only those fields you would like to be updated with this request
        if (details.getCode() != null && !details.getCode().isEmpty()) 
            storedDetails.setName1(details.getName1());
        
        storedDetails.setName2(details.getName2());
        storedDetails.setActivated(details.getActivated());
        storedDetails.setUniversity(details.getUniversity());
        storedDetails.setAddress(details.getAddress());
        storedDetails.setCurrentVersion(details.getCurrentVersion());
        storedDetails.setDate(details.getDate());
        storedDetails.setDates(details.getDates());
        storedDetails.setDescription(details.getDescription());
        storedDetails.setPhoneNumber(details.getPhoneNumber());
        storedDetails.setRemark1(details.getRemark1());

        // Update User Details
        collageService.update(storedDetails);

        // Prepare return value 
        CollageResponseRest returnValue = new CollageResponseRest();
        BeanUtils.copyProperties(storedDetails, returnValue);

        return returnValue;
    

    @Secured
    @DELETE
    @Path("/id")
    @Produces(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
    public DeleteResponseModel delete(@PathParam("id") String id) 
        DeleteResponseModel returnValue = new DeleteResponseModel();
        returnValue.setRequestOperation(RequestOperation.DELETE);

        CollageDTO storedRecord = collageService.get(id);

        collageService.delete(storedRecord);

        returnValue.setResponseStatus(ResponseStatus.SUCCESS);

        return returnValue;
    

拼贴DTO:

public class CollageDTO  implements java.io.Serializable 

    private static final long serialVersionUID = 1L;



     private String id;
     private University university;
     private String code;
     private Integer currentVersion;
     private Date date;
     private String dates;
     private String description;
     private String remark1;
     private String name1;
     private String name2;
     private Boolean activated;
     private String address;
     private String phoneNumber;
     private String entityType;

    /**
     * @return the id
     */
    public String getId() 
        return id;
    

    /**
     * @param id the id to set
     */
    public void setId(String id) 
        this.id = id;
    

    /**
     * @return the university
     */
    public University getUniversity() 
        return university;
    

    /**
     * @param university the university to set
     */
    public void setUniversity(University university) 
        this.university = university;
    

    /**
     * @return the code
     */
    public String getCode() 
        return code;
    

    /**
     * @param code the code to set
     */
    public void setCode(String code) 
        this.code = code;
    

    /**
     * @return the currentVersion
     */
    public Integer getCurrentVersion() 
        return currentVersion;
    

    /**
     * @param currentVersion the currentVersion to set
     */
    public void setCurrentVersion(Integer currentVersion) 
        this.currentVersion = currentVersion;
    

    /**
     * @return the date
     */
    public Date getDate() 
        return date;
    

    /**
     * @param date the date to set
     */
    public void setDate(Date date) 
        this.date = date;
    

    /**
     * @return the description
     */
    public String getDescription() 
        return description;
    

    /**
     * @param description the description to set
     */
    public void setDescription(String description) 
        this.description = description;
    

    /**
     * @return the remark1
     */
    public String getRemark1() 
        return remark1;
    

    /**
     * @param remark1 the remark1 to set
     */
    public void setRemark1(String remark1) 
        this.remark1 = remark1;
    

    /**
     * @return the name1
     */
    public String getName1() 
        return name1;
    

    /**
     * @param name1 the name1 to set
     */
    public void setName1(String name1) 
        this.name1 = name1;
    

    /**
     * @return the name2
     */
    public String getName2() 
        return name2;
    

    /**
     * @param name2 the name2 to set
     */
    public void setName2(String name2) 
        this.name2 = name2;
    

    /**
     * @return the activated
     */
    public Boolean getActivated() 
        return activated;
    

    /**
     * @param activated the activated to set
     */
    public void setActivated(Boolean activated) 
        this.activated = activated;
    

    /**
     * @return the address
     */
    public String getAddress() 
        return address;
    

    /**
     * @param address the address to set
     */
    public void setAddress(String address) 
        this.address = address;
    

    /**
     * @return the phoneNumber
     */
    public String getPhoneNumber() 
        return phoneNumber;
    

    /**
     * @param phoneNumber the phoneNumber to set
     */
    public void setPhoneNumber(String phoneNumber) 
        this.phoneNumber = phoneNumber;
    

    /**
     * @return the entityType
     */
    public String getEntityType() 
        return entityType;
    

    /**
     * @param entityType the entityType to set
     */
    public void setEntityType(String entityType) 
        this.entityType = entityType;
    

    /**
     * @return the dates
     */
    public String getDates() 
        return dates;
    

    /**
     * @param dates the dates to set
     */
    public void setDates(String dates) 
        this.dates = dates;
    



Collage Entity: 

@Entity
@Table(name="Collage"
    ,schema="dbo"
    ,catalog="hayez"
)
public class Collage  implements java.io.Serializable 


     private String id;
     private University university;
     private String code;
     private Integer currentVersion;
     private Date date;
     private String description;
     private String remark1;
     private String name1;
     private String name2;
     private Boolean activated;
     private String address;
     private String phoneNumber;
     private String entityType;
     private Set visitors = new HashSet(0);
     private Set groupOfVisitorses = new HashSet(0);
     private Set groupOfVisitorses_1 = new HashSet(0);
     private Set visitors_1 = new HashSet(0);

    public Collage() 
    


    public Collage(String id) 
        this.id = id;
    
    public Collage(String id, University university, String code, Integer currentVersion, Date date, String description, String remark1, String name1, String name2, Boolean activated, String address, String phoneNumber, String entityType, Set visitors, Set groupOfVisitorses, Set groupOfVisitorses_1, Set visitors_1) 
       this.id = id;
       this.university = university;
       this.code = code;
       this.currentVersion = currentVersion;
       this.date = date;
       this.description = description;
       this.remark1 = remark1;
       this.name1 = name1;
       this.name2 = name2;
       this.activated = activated;
       this.address = address;
       this.phoneNumber = phoneNumber;
       this.entityType = entityType;
       this.visitors = visitors;
       this.groupOfVisitorses = groupOfVisitorses;
       this.groupOfVisitorses_1 = groupOfVisitorses_1;
       this.visitors_1 = visitors_1;
    

     @Id 


    @Column(name="id", unique=true, nullable=false)
    public String getId() 
        return this.id;
    

    public void setId(String id) 
        this.id = id;
    

@ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name="University_Id")
    public University getUniversity() 
        return this.university;
    

    public void setUniversity(University university) 
        this.university = university;
    


    @Column(name="code")
    public String getCode() 
        return this.code;
    

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


    @Column(name="currentVersion")
    public Integer getCurrentVersion() 
        return this.currentVersion;
    

    public void setCurrentVersion(Integer currentVersion) 
        this.currentVersion = currentVersion;
    

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="date", length=23)
    public Date getDate() 
        return this.date;
    

    public void setDate(Date date) 
        this.date = date;
    


    @Column(name="description")
    public String getDescription() 
        return this.description;
    

    public void setDescription(String description) 
        this.description = description;
    


    @Column(name="remark1")
    public String getRemark1() 
        return this.remark1;
    

    public void setRemark1(String remark1) 
        this.remark1 = remark1;
    


    @Column(name="name1")
    public String getName1() 
        return this.name1;
    

    public void setName1(String name1) 
        this.name1 = name1;
    


    @Column(name="name2")
    public String getName2() 
        return this.name2;
    

    public void setName2(String name2) 
        this.name2 = name2;
    


    @Column(name="activated")
    public Boolean getActivated() 
        return this.activated;
    

    public void setActivated(Boolean activated) 
        this.activated = activated;
    


    @Column(name="address")
    public String getAddress() 
        return this.address;
    

    public void setAddress(String address) 
        this.address = address;
    


    @Column(name="phoneNumber")
    public String getPhoneNumber() 
        return this.phoneNumber;
    

    public void setPhoneNumber(String phoneNumber) 
        this.phoneNumber = phoneNumber;
    


    @Column(name="entityType")
    public String getEntityType() 
        return this.entityType;
    

    public void setEntityType(String entityType) 
        this.entityType = entityType;
    

@OneToMany(fetch=FetchType.LAZY, mappedBy="collage")
    public Set getVisitors() 
        return this.visitors;
    

    public void setVisitors(Set visitors) 
        this.visitors = visitors;
    

@OneToMany(fetch=FetchType.LAZY, mappedBy="collage")
    public Set getGroupOfVisitorses() 
        return this.groupOfVisitorses;
    

    public void setGroupOfVisitorses(Set groupOfVisitorses) 
        this.groupOfVisitorses = groupOfVisitorses;
    

@OneToMany(fetch=FetchType.LAZY, mappedBy="collage")
    public Set getGroupOfVisitorses_1() 
        return this.groupOfVisitorses_1;
    

    public void setGroupOfVisitorses_1(Set groupOfVisitorses_1) 
        this.groupOfVisitorses_1 = groupOfVisitorses_1;
    

@OneToMany(fetch=FetchType.LAZY, mappedBy="collage")
    public Set getVisitors_1() 
        return this.visitors_1;
            
    public void setVisitors_1(Set visitors_1) 
        this.visitors_1 = visitors_1;
          

和 DAOSQL 实现

@Override
    public List<CollageDTO> getAll(int start, int limit) 
        CriteriaBuilder cb = session.getCriteriaBuilder();
        //Create Criteria against a particular persistent class
        CriteriaQuery<Collage> criteria = cb.createQuery(Collage.class);
        //Query roots always reference entities
        Root<Collage> collageRoot = criteria.from(Collage.class);
        criteria.select(collageRoot);
        // Fetch results from start to a number of "limit"
        List<Collage> searchResults = session.createQuery(criteria).list();

        List<CollageDTO> returnValue = new ArrayList<CollageDTO>();
        for (Collage collage : searchResults)  
            CollageDTO collageDTO = new CollageDTO();
            BeanUtils.copyProperties(collage, collageDTO);
            returnValue.add(collageDTO);
        
        return returnValue;
    

这是hibernate.cfg文件

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
    <property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433;databaseName=hayez</property>
    <property name="hibernate.connection.username">sa</property>
    <property name="hibernate.connection.password">sa@123</property>
    <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="hibernate.id.new_generator_mappings">true</property>
    <property name="show_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">25</property>
    <property name="hibernate.c3p0.timeout">300</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="current_session_context_class">thread</property>
    <property
    name="hibernate.enable_lazy_load_no_trans"
    >false</property>
    <mapping resource="tech/basarsoft/hayez/io/entity/VisitorPoints.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/Branch.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/SalesInvoiceLine.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/VisitingDocument.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/Supplier.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/Room.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/GroupOfVisitorsLine.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/VisitingDocumentLine.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/GroupOfVisitors.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/Visitor.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/University.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/Quantity.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/Collage.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/Warehouse.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/Employee.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/PurchaseInvoiceLine.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/Item.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/SalesInvoice.hbm.xml"/>
    <mapping resource="tech/basarsoft/hayez/io/entity/PurchaseInvoice.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

拼贴服务:

public class CollageServiceImpl implements CollageService 

    CollageDAO database;

    public CollageServiceImpl(CollageDAO database) 
        this.database = database;
    

    EntityUtils entityUtils = new EntityUtils();

    @Override
    public CollageDTO create(CollageDTO cdto) 
        CollageDTO returnValue = null;
        // Check if user already exists
        CollageDTO existingRecord = this.getByCode(cdto.getCode());
        if (existingRecord != null) 
            throw new CouldNotCreateRecordException(ErrorMessages.RECORD_ALREADY_EXISTS.name());
        
        if (cdto.getDates() != null) 
            try 
                Date date;
                date = entityUtils.ConvertDateString(cdto.getDates());
                cdto.setDate(date);
             catch (ParseException ex) 
                cdto.setDate(null);
            
         else 
            cdto.setDate(null);

        

        String Id = entityUtils.generateEntityId(30);
        cdto.setId(Id);
        cdto.setEntityType("Collage");
        cdto.setActivated(true);
        // Record data into a database 
        returnValue = this.save(cdto);

        // Return back the user profile
        return returnValue;
    

    @Override
    public CollageDTO get(String id) 
        CollageDTO returnValue = null;
        try 
            this.database.openConnection();
            returnValue = this.database.get(id);
         catch (Exception ex) 
            ex.printStackTrace();
            throw new NoRecordFoundException(ErrorMessages.NO_RECORD_FOUND.getErrorMessage());
         finally 
            this.database.closeConnection();
        
        return returnValue;
    

    @Override
    public CollageDTO getByCode(String code) 
        CollageDTO collageDTO = null;

        if (code == null || code.isEmpty()) 
            return collageDTO;
        

        // Connect to database 
        try 
            this.database.openConnection();
            collageDTO = this.database.getByCode(code);
         finally 
            this.database.closeConnection();
        

        return collageDTO;
    

    @Override
    public List<CollageDTO> getAll(int start, int limit) 
        List<CollageDTO> cdtos = null;
       University university = new University();
        // Get users from database
        try 
            this.database.openConnection();
            cdtos = this.database.getAll(start, limit);
         finally 
            this.database.closeConnection();
        

        return cdtos;
    

    @Override
    public void update(CollageDTO cdto) 
        try 

            if (cdto.getDates() != null) 
                try 
                    Date date;
                    date = entityUtils.ConvertDateString(cdto.getDates());
                    cdto.setDate(date);
                 catch (ParseException ex) 
                    cdto.setDate(null);
                
             else 
                cdto.setDate(null);

            
            // Connect to database 
            this.database.openConnection();
            // Update User Details
            this.database.update(cdto);

         catch (Exception ex) 
            throw new CouldNotUpdateRecordException(ex.getMessage());
         finally 
            this.database.closeConnection();
        
    

    @Override
    public void delete(CollageDTO cdto) 
        try 
            this.database.openConnection();
            this.database.delete(cdto);
         catch (Exception ex) 
            throw new CouldNotDeleteRecordException(ex.getMessage());
         finally 
            this.database.closeConnection();
        

        // Verify that user is deleted
        try 
            cdto = get(cdto.getId());
         catch (NoRecordFoundException ex) 
            cdto = null;
        

        if (cdto != null) 
            throw new CouldNotDeleteRecordException(
                    ErrorMessages.COULD_NOT_DELETE_RECORD.getErrorMessage());
        
    

    private CollageDTO save(CollageDTO cdto) 
        CollageDTO returnValue = null;
        // Connect to database 
        try 

            this.database.openConnection();
            returnValue = this.database.save(cdto);
         finally 
            this.database.closeConnection();
        

        return returnValue;
    


拼贴映射:

<hibernate-mapping>
    <class name="tech.basarsoft.hayez.io.entity.Collage" table="Collage" schema="dbo" catalog="hayez" optimistic-lock="version">
        <id name="id" type="string">
            <column name="id" />
            <generator class="assigned" />
        </id>
        <many-to-one name="university" class="tech.basarsoft.hayez.io.entity.University" fetch="join">
            <column name="University_Id" />
        </many-to-one>
        <property name="code" type="string">
            <column name="code" />
        </property>
        <property name="currentVersion" type="java.lang.Integer">
            <column name="currentVersion" />
        </property>
        <property name="date" type="timestamp">
            <column name="date" length="23" />
        </property>
        <property name="description" type="string">
            <column name="description" />
        </property>
        <property name="remark1" type="string">
            <column name="remark1" />
        </property>
        <property name="name1" type="string">
            <column name="name1" />
        </property>
        <property name="name2" type="string">
            <column name="name2" />
        </property>
        <property name="activated" type="java.lang.Boolean">
            <column name="activated" />
        </property>
        <property name="address" type="string">
            <column name="address" />
        </property>
        <property name="phoneNumber" type="string">
            <column name="phoneNumber" />
        </property>
        <property name="entityType" type="string">
            <column name="entityType" />
        </property>
    </class>
</hibernate-mapping>

大学地图:

<hibernate-mapping>
    <class name="tech.basarsoft.hayez.io.entity.University" table="University" schema="dbo" catalog="hayez" optimistic-lock="version">
        <id name="id" type="string">
            <column name="id" />
            <generator class="assigned" />
        </id>
        <property name="code" type="string">
            <column name="code" />
        </property>
        <property name="currentVersion" type="java.lang.Integer">
            <column name="currentVersion" />
        </property>
        <property name="date" type="timestamp">
            <column name="date" length="23" />
        </property>
        <property name="description" type="string">
            <column name="description" />
        </property>
        <property name="remark1" type="string">
            <column name="remark1" />
        </property>
        <property name="name1" type="string">
            <column name="name1" />
        </property>
        <property name="name2" type="string">
            <column name="name2" />
        </property>
        <property name="activated" type="java.lang.Boolean">
            <column name="activated" />
        </property>
        <property name="address" type="string">
            <column name="address" />
        </property>
        <property name="phoneNumber" type="string">
            <column name="phoneNumber" />
        </property>
        <property name="entityType" type="string">
            <column name="entityType" />
        </property>
        <set name="collages" table="Collage" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="University_Id" />
            </key>
            <one-to-many class="tech.basarsoft.hayez.io.entity.Collage" />
        </set>

    </class>
</hibernate-mapping>

我使用 Hibernate With Spring , jersey 和 MSSQL server 来创建 apis

【问题讨论】:

添加@Transactional 注释到CollageService(Impl) ..可能重复!!! (org.hibernate.LazyInitializationException: could not initialize proxy - no Session) ...出于一致性原因,您可以将其添加到CollageEntryPoint 【参考方案1】:

我通过将拼贴类更改为找到解决方案:

@Entity
@Table(name="Collage"
    ,schema="dbo"
    ,catalog="hayez"
)
public class Collage  implements java.io.Serializable 


    @Id
    @Column(name="id", unique=true, nullable=false)
     private String id;
     @Column(name="code")
     private String code;
     @Column(name="currentVersion")
     private Integer currentVersion;
     @Temporal(TemporalType.TIMESTAMP)
     @Column(name="date", length=23)
     private Date date;
     @Column(name="description")
     private String description;
     @Column(name="remark1")
     private String remark1;
     @Column(name="name1")
     private String name1;
     @Column(name="name2")
     private String name2;
     @Column(name="activated")
     private Boolean activated;
     @Column(name="address")
     private String address;
     @Column(name="phoneNumber")
     private String phoneNumber;
     @Column(name="entityType")
     private String entityType;
     @ManyToOne(fetch=FetchType.EAGER, cascade = CascadeType.ALL)
     @JoinColumn(name="University_Id")
      private University university;


    public Collage() 
    


 <!-- Setter And Getter Here ... -->

【讨论】:

以上是关于org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话 -的主要内容,如果未能解决你的问题,请参考以下文章