You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate调用Optional的toString()抛出org.hibernate.HibernateException问题

Hibernate异常与API调试问题

问题1:调用Optional对象toString()抛出HibernateException

使用Hibernate时遇到异常:调用Optional对象的toString()方法时抛出org.hibernate.HibernateException。
具体场景:模型中的Hibernate实体包含一个声明为Optional的属性,通过Hibernate检索该实体实例后,调用该Optional的toString()方法触发异常。此问题在为Client实体添加Logo属性后出现,此前功能正常。

问题2:按阶段返回商机的API无法正确返回商机描述

调试按阶段返回商机的API时,发现商机描述无法正确返回;使用Postman测试该API时收到错误信息。


相关代码

EtapeEntity

package com.example.crm_amosys_orass.model;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.List;
@Entity
@Component
@AllArgsConstructor
@NoArgsConstructor
@Data
@Table(name = "crm_Opportunite_etape")
public class EtapeEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idEtape;
    private String name;
    // Constructors, getters, and setters
    @OneToMany(mappedBy = "etape", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<OpportuniteEntity> opportunite;
}

OpportuniteEntity

package com.example.crm_amosys_orass.model;

import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "crm_opportunities_information")
@Builder
@Component
public class OpportuniteEntity {
    //Type
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idOpportunity;
    private String name;
    // private String stage;
    private LocalDate closeDate;
    private String Statu;
    @ManyToOne
    @JoinColumn(name = "idUser")
    private UserEntity user;

    /*@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "idClient")
    private ClientEntity client;*/

    @ManyToOne
    @JoinColumn(name="idEtape", nullable = false)
    private EtapeEntity etape;

    //@ManyToOne(fetch = FetchType.LAZY)
    /******  @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="idEtape")
    EtapeEntity etape1;*******/
    @OneToMany(mappedBy = "opportunite", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<ProduitOpportuniterEntity> produits;
    /*  @ManyToMany
        @JoinTable(name = "opportunity_product",
                joinColumns = @JoinColumn(name = "idOpportunity"),
                inverseJoinColumns = @JoinColumn(name = "idProduct"))
        private Set<ProduitEntity> products = new HashSet<>();*/

    //*********************************************************************************

    @ManyToOne
    @JoinColumn(name = "idClient")
    private ClientEntity client;
}

ClientEntity

package com.example.crm_amosys_orass.model;
import com.fasterxml.jackson.annotation.JsonBackReference;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
@Entity
@Component
@AllArgsConstructor
@NoArgsConstructor
@Data
@Table(name = "crm_client_information")
public class ClientEntity {
    //Classe Client
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idClient;

    @Column(name = "Entreprise_Principal")
    private String entreprisePrincipal;
    @Column(name = "SiteWeb_Entreprise")
    private String siteWebEntreprise;
    @Column(name = "Nom_Prenom")
    private String nomPrenom;
    @Column(name = "Code_Client")
    private String codeClient;
    @Column(name = "Fax")
    private String fax;

    @Column(name = "Tele_Fix")
    private String teleFixe;

    @Column(name = "E_mail")
    private String email;

    @Column(name ="Linkdin")
    private String linkdin;

    @Column(name ="Register_Commercial")
    private String registerCommercial;

    @Column(name ="Chifre_D'affir")
    private String chifreDaffir;
    @Column(name ="nombre_Employe")
    private String nombreEmploye;

    @DateTimeFormat(pattern = "yyyy-MM-dd") // Specify the date pattern
    @Column(name = "Date_creat_Client")
    private LocalDate dateCreatClient;
    @DateTimeFormat(pattern = "yyyy-MM-dd") // Specify the date pattern
    @Column(name = "DateAgrement")
    private LocalDate dateAgrement;
    @ManyToOne
    @JoinColumn(name = "idCountry")
    private CountryEntity country;

    @OneToMany(mappedBy = "client")
    private List<ContactEntity> contacts;
    //    lllllll
    //    @OneToMany
    //     List<ProduitEntity> produits;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Temporal(TemporalType.DATE)
    private Date dateAchatP;
    @OneToMany(mappedBy = "client")
    private List<ProduitClientEntity> produits;
    // @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @OneToMany(mappedBy = "client")
    private List<OpportuniteEntity> opportunites;
    @OneToOne
    @JoinColumn(name = "id")
    private LogoEntity logo;
}

EtapeController(异常API)

@GetMapping("/crm_etape_etapeOpp/{idEtape}")
public ResponseEntity<List<OpportunityDTO>> getOpportunite(@PathVariable long idEtape){
    return new ResponseEntity<>(etapeService.getOpportunite(idEtape),HttpStatus.OK);
}

EtapeService

public List<OpportunityDTO> getOpportunite(long idEtape) {
    Optional<EtapeEntity> etape = etapeRepository.findById(idEtape);
    List<OpportuniteEntity> opportunites = etape.get().getOpportunite();
    // List<OpportuniteEntity> opportunites1 = etape.get().getOpportunite();
    return opportunityMapper.ToOpportuniteDtos(opportunites);
}

内容的提问来源于stack exchange,提问作者RAJA BEN BOURCH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:24:54