无法评估表达式方法抛出“org.hibernate.exception.GenericJDBCException”异常

spe*_*eng 1 java hibernate spring-mvc spring-data-jpa spring-boot

我的应用程序中有 2 个模型,它们具有一对多和多对一的关系。

模型类是:

发票模型

@Entity
@Data
public class Invoice implements java.io.Serializable {
    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid2")
    private String id;

    private String business;

    private String client;

    private String invoiceNo;

    @Enumerated(EnumType.STRING)
    private InvoiceStatus status;

    private String additionalInfo;

    @OneToMany(mappedBy = "invoice")
    private Set<InvoiceItem> items = new HashSet<>();

    @CreationTimestamp
    private LocalDateTime createdAt;

    @UpdateTimestamp
    private LocalDateTime updatedAt;

    private LocalDateTime deletedAt;
}
Run Code Online (Sandbox Code Playgroud)

发票项目模型

@Entity
@Data
public class InvoiceItem {
    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid2")
    private String id;

    @ManyToOne
    @JoinColumn(name="invoice_id", nullable = false)
    private Invoice invoice;

    private String description;

    @Enumerated(EnumType.STRING)
    private InvoiceItemType type;

    @CreationTimestamp
    private LocalDateTime createdAt;

    @UpdateTimestamp
    private LocalDateTime updatedAt;

    private LocalDateTime deletedAt;
}
Run Code Online (Sandbox Code Playgroud)

我有一个 api 端点,用于为发票创建发票项

@RestController
@RequestMapping(path="/api/v1/invoices/{invoice}/items")
public class InvoiceItemController {

    @Autowired
    private ModelMapper modelMapper;

    @Autowired
    private InvoiceItemService invoiceItemService;

    @Autowired
    private InvoiceService invoiceService;

    @PostMapping
    public ResponseEntity<InvoiceItem> addInvoiceItem(@PathVariable("invoice") String invoiceId, @RequestBody InvoiceItemCreationDto invoiceItemCreationDto) throws NotFoundException {

        Optional<Invoice> invoiceOptional = invoiceService.findInvoiceById(invoiceId);

        if (!invoiceOptional.isPresent()) {
            throw new NotFoundException("Invoice not found");
        }

        InvoiceItem invoiceItem = modelMapper.map(invoiceItemCreationDto, InvoiceItem.class);
        invoiceItem.setInvoice(invoiceOptional.get());

        InvoiceItem savedInvoiceItem = invoiceItemService.addInvoiceItem(invoiceItem);
        return new ResponseEntity<>(savedInvoiceItem, HttpStatus.CREATED);
    }
}
Run Code Online (Sandbox Code Playgroud)

发票服务

package com.spencerfeng.invoiceservice.services;

import com.spencerfeng.invoiceservice.models.Invoice;
import com.spencerfeng.invoiceservice.repositories.InvoiceRepository;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Optional;

public class InvoiceServiceImpl implements InvoiceService {
    @Autowired
    InvoiceRepository invoiceRepository;

    @Override
    public Invoice addInvoice(Invoice invoice) {
        return invoiceRepository.save(invoice);
    }

    @Override
    public Optional<Invoice> findInvoiceById(String id) {
        return invoiceRepository.findById(id);
    }
}
Run Code Online (Sandbox Code Playgroud)

发票库

package com.spencerfeng.invoiceservice.repositories;

import com.spencerfeng.invoiceservice.models.Invoice;
import org.springframework.data.repository.CrudRepository;

public interface InvoiceRepository extends CrudRepository<Invoice, String> {
}
Run Code Online (Sandbox Code Playgroud)

发票项目服务

package com.spencerfeng.invoiceservice.services;

import com.spencerfeng.invoiceservice.models.InvoiceItem;
import com.spencerfeng.invoiceservice.repositories.InvoiceItemRepository;
import org.springframework.beans.factory.annotation.Autowired;

public class InvoiceItemServiceImpl implements InvoiceItemService {
    @Autowired
    private InvoiceItemRepository invoiceItemRepository;

    @Override
    public InvoiceItem addInvoiceItem(InvoiceItem invoiceItem) {
        return invoiceItemRepository.save(invoiceItem);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我调用这个 api 端点来为发票创建一个 invoiceItem 时,invoiceOptional 中的 items 属性有“无法评估表达式 Method throw 'org.hibernate.exception.GenericJDBCException”异常,而其他属性很好。

问题截图

在此处输入图片说明

小智 7

您可以尝试排除一个 POJO 上的循环 tostring\hashcode 引用:

@ToString(exclude = "invoice")
@EqualsAndHashCode(exclude = "invoice")
@Entity
@Getter @Setter
public class InvoiceItem {
Run Code Online (Sandbox Code Playgroud)

或者通过在字段上使用 @EqualsAndHashCode.Exclude & @ToString.Exclude 来做到这一点

@Entity
@Data
public class InvoiceItem {
    @ManyToOne 
    @EqualsAndHashCode.Exclude @ToString.Exclude
    @JoinColumn(name="invoice_id", nullable = false)
    private Invoice invoice;
Run Code Online (Sandbox Code Playgroud)