【发布时间】:2019-11-28 04:08:42
【问题描述】:
我与 PurchaseDetails 有 OneToMany 关系。 Purchase Entity 有基本的详细信息,PurchaseDetails 有一个已购买项目的列表。我想要实现的是在将数据保存到购买项目的购买表(父)列表时,也会自动保存在 PurchaseDetail 表(子)中。
2019-07-19 13:05:53.581 警告 8868 --- [nio-8060-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper:SQL 错误:1048,SQLState: 23000 2019-07-19 13:05:53.581 错误 8868 --- [nio-8060-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper:列“purchaseId”不能 为空
Purchase.java
@Entity
@Table(name = "purchase")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Purchase {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "purchaseId")
private BigInteger purchaseId;
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name="accountId", nullable = false)
private Account account;
@JsonBackReference
@OneToMany(mappedBy="purchase",fetch=FetchType.LAZY,cascade = CascadeType.PERSIST)
private List<PurchaseDetails> purchaseDetails = new ArrayList<PurchaseDetails>();
private Date purchaseDate;
private String name;
private String address;
private String whatsapp;
private String payStatus;
private int creditDays;
private Float loading;
private BigInteger purchaseAmount;
private BigInteger receivedAmount;
private String remarks;
private Date creation;
private Date lastedit;
private Boolean isDeleted;
@PrePersist
protected void onCreate() {
creation = new Date();
lastedit = new Date();
isDeleted = false;
}
}
PurchaseDetails.java
@Entity
@Table(name = "purchaseDetails")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class PurchaseDetails {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private BigInteger purchaseDetailId;
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Purchase.class)
@JoinColumn(name="purchaseId", referencedColumnName = "purchaseId", nullable = false)
// @MapsId(value = "purchaseId")
private Purchase purchase;
@OneToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "itemId", nullable = false)
private Item item;
private Float quantity;
private Float rate;
private Float rateGST;
private Float subTotal;
private Float subTotalGST;
private Date creation;
private Date lastedit;
private Boolean isDeleted;
@PrePersist
protected void onCreate() {
creation = new Date();
lastedit = new Date();
isDeleted = false;
}
}
PurchaseService.java
@Service
public class PurchaseService {
@Autowired PurchaseRepository purchaseRepository;
public boolean newPurchase(Purchase purchase, StringResponseDTO response)
{
if(isValidPurchaseData(purchase))
{
System.out.println("Service: "+purchase.toString());
purchase.setPurchaseDetails(purchase.getPurchaseDetails());
purchaseRepository.save(purchase);
response.setMessage("Purchase of "+ purchase.getName() + " is added successfuly");
return true;
}
else
{
response.setMessage("Please Provide Valid Data");
return false;
}
}
}
来自 Postman 的输入 JSON (值仅用于测试,因此请忽略 subTotal 等)
{
"purchaseDate":"2019-07-18T08:37:41.000+0000",
"name":"PersonName",
"address":"Besides xyz Hotel, NH - 5, India",
"whatsapp":"1234567899",
"payStatus":"Paid",
"creditDays":"0",
"purchaseAmount":"2600",
"receivedAmount":"2600",
"loading":"100",
"remarks":"Not Any",
"purchaseDetails":[
{
"quantity":"523.6",
"rate":"67",
"rateGST":"70",
"subTotal":"35081",
"subTotalGST":"36652",
"item":{
"itemId":"14"
}
},
{
"quantity":"222.6",
"rate":"67",
"rateGST":"70",
"subTotal":"35081",
"subTotalGST":"36652",
"item":{
"itemId":"16"
}
}],
"account":{
"accountId":"4"
}
}
【问题讨论】:
-
在
purchaseId上尝试@GeneratedValue(strategy = GenerationType.AUTO)
标签: java spring hibernate spring-boot foreign-keys