【发布时间】:2020-04-30 14:41:51
【问题描述】:
我的应用程序中有 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;
}
InvoiceItem 模型
@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;
}
我有一个 api 端点,用于为发票创建 invoiceItem
@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);
}
}
发票服务
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);
}
}
发票存储库
package com.spencerfeng.invoiceservice.repositories;
import com.spencerfeng.invoiceservice.models.Invoice;
import org.springframework.data.repository.CrudRepository;
public interface InvoiceRepository extends CrudRepository<Invoice, String> {
}
InvoiceItem 服务
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);
}
}
但是当我调用此 api 端点为发票创建 invoiceItem 时,invoiceOptional 中的 items 属性具有“无法评估表达式 Method throw 'org.hibernate.exception.GenericJDBCException”异常,而其他属性很好.
【问题讨论】:
-
你好@spencerfeng,你可以让 show sql =true 并检查生成了什么 sql 吗?
-
问题中还要添加代码 invoiceService
-
@MandarDharurkar 谢谢你,我已经添加了所有的细节。
-
我不确定这是否与
Invoice.toString()中的 StackOverflowError 相关的问题可能需要调查。如果必须猜测,我会假设它是 Invoice InvoiceItem 关系。 -
@Thomas 谢谢,我想是的。你知道这个问题的一般解决方案是什么吗?我是否需要为 Invoice 模型或其他东西编写自定义 toString() 方法?
标签: java hibernate spring-boot spring-mvc spring-data-jpa