2017-02-10 82 views
0

嘿我試圖插入數據到數據庫,但得到錯誤,我已經閱讀所有從stackoverflow,但無法得到我的解決方案。無法添加或更新子行:外鍵約束在休眠失敗

不能添加或更新子行,外鍵約束失敗(posexchange_order_detail,約束FK_5ed8cb725cbc40e2be44a4ab3d9外鍵(GOODS_DETAIL_ID2)參考文獻goods_detailID))

這裏是我的代碼

package com.istana.pos.db.domain; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

@SuppressWarnings("serial") 
@Entity 
@Table(name = "EXCHANGE_ORDER_DETAIL", schema = "pos") 
public class ExchangeOrderDetail implements java.io.Serializable { 

    private int id; 
    private String exchangeNumber; 
    private Integer goodsDetailId1; 
    private Integer goodsDetailId2; 
    private double price1; 
    private double price2; 
    private double discount1; 
    private double discount2; 

    private ExchangeOrder exchangeOrder; 
    private GoodsDetail goodsDetail1; 
    private GoodsDetail goodsDetail2; 

    @Id 
    @Column(name = "ID", unique = true, nullable = false) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public int getId() { 
     return this.id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @Column(name = "EXCHANGE_NUMBER", nullable = false) 
    public String getExchangeNumber() { 
     return exchangeNumber; 
    } 

    public void setExchangeNumber(String exchangeNumber) { 
     this.exchangeNumber = exchangeNumber; 
    } 

    @Column(name = "GOODS_DETAIL_ID1", nullable = false) 
    public Integer getGoodsDetailId1() { 
     return goodsDetailId1; 
    } 

    public void setGoodsDetailId1(int goodsDetailId1) { 
     this.goodsDetailId1 = goodsDetailId1; 
    } 

    @Column(name = "GOODS_DETAIL_ID2", nullable = false) 
    public Integer getGoodsDetailId2() { 
     return goodsDetailId2; 
    } 

    public void setGoodsDetailId2(int goodsDetailId2) { 
     this.goodsDetailId2 = goodsDetailId2; 
    } 

    @Column(name = "PRICE1") 
    public double getPrice1() { 
     return price1; 
    } 

    public void setPrice1(double price1) { 
     this.price1 = price1; 
    } 

    @Column(name = "PRICE2") 
    public double getPrice2() { 
     return price2; 
    } 

    public void setPrice2(double price2) { 
     this.price2 = price2; 
    } 

    @Column(name = "DISCOUNT1") 
    public double getDiscount1() { 
     return discount1; 
    } 

    public void setDiscount1(double discount1) { 
     this.discount1 = discount1; 
    } 

    @Column(name = "DISCOUNT2") 
    public double getDiscount2() { 
     return discount2; 
    } 

    public void setDiscount2(double discount2) { 
     this.discount2 = discount2; 
    } 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "EXCHANGE_NUMBER", nullable = true, insertable = false, updatable = false, referencedColumnName = "EXCHANGE_NUMBER") 
    public ExchangeOrder getExchangeOrder() { 
     return exchangeOrder; 
    } 

    public void setExchangeOrder(ExchangeOrder exchangeOrder) { 
     this.exchangeOrder = exchangeOrder; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "GOODS_DETAIL_ID1", nullable = false, insertable = false, updatable = false, referencedColumnName = "ID") 
    public GoodsDetail getGoodsDetail1() { 
     return goodsDetail1; 
    } 

    public void setGoodsDetail1(GoodsDetail goodsDetail1) { 
     this.goodsDetail1 = goodsDetail1; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "GOODS_DETAIL_ID2", nullable = false, insertable = false, updatable = false, referencedColumnName = "ID") 
    public GoodsDetail getGoodsDetail2() { 
     return goodsDetail2; 
    } 

    public void setGoodsDetail2(GoodsDetail goodsDetail2) { 
     this.goodsDetail2 = goodsDetail2; 
    } 

} 

另一個Java類

package com.istana.pos.db.domain; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

@SuppressWarnings("serial") 
@Entity 
@Table(name = "EXCHANGE_ORDER_DETAIL", schema = "pos") 
public class ExchangeOrderDetail implements java.io.Serializable { 

    private int id; 
    private String exchangeNumber; 
    private Integer goodsDetailId1; 
    private Integer goodsDetailId2; 
    private double price1; 
    private double price2; 
    private double discount1; 
    private double discount2; 

    private ExchangeOrder exchangeOrder; 
    private GoodsDetail goodsDetail1; 
    private GoodsDetail goodsDetail2; 

    @Id 
    @Column(name = "ID", unique = true, nullable = false) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public int getId() { 
     return this.id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @Column(name = "EXCHANGE_NUMBER", nullable = false) 
    public String getExchangeNumber() { 
     return exchangeNumber; 
    } 

    public void setExchangeNumber(String exchangeNumber) { 
     this.exchangeNumber = exchangeNumber; 
    } 

    @Column(name = "GOODS_DETAIL_ID1", nullable = false) 
    public Integer getGoodsDetailId1() { 
     return goodsDetailId1; 
    } 

    public void setGoodsDetailId1(int goodsDetailId1) { 
     this.goodsDetailId1 = goodsDetailId1; 
    } 

    @Column(name = "GOODS_DETAIL_ID2", nullable = false) 
    public Integer getGoodsDetailId2() { 
     return goodsDetailId2; 
    } 

    public void setGoodsDetailId2(int goodsDetailId2) { 
     this.goodsDetailId2 = goodsDetailId2; 
    } 

    @Column(name = "PRICE1") 
    public double getPrice1() { 
     return price1; 
    } 

    public void setPrice1(double price1) { 
     this.price1 = price1; 
    } 

    @Column(name = "PRICE2") 
    public double getPrice2() { 
     return price2; 
    } 

    public void setPrice2(double price2) { 
     this.price2 = price2; 
    } 

    @Column(name = "DISCOUNT1") 
    public double getDiscount1() { 
     return discount1; 
    } 

    public void setDiscount1(double discount1) { 
     this.discount1 = discount1; 
    } 

    @Column(name = "DISCOUNT2") 
    public double getDiscount2() { 
     return discount2; 
    } 

    public void setDiscount2(double discount2) { 
     this.discount2 = discount2; 
    } 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "EXCHANGE_NUMBER", nullable = true, insertable = false, updatable = false, referencedColumnName = "EXCHANGE_NUMBER") 
    public ExchangeOrder getExchangeOrder() { 
     return exchangeOrder; 
    } 

    public void setExchangeOrder(ExchangeOrder exchangeOrder) { 
     this.exchangeOrder = exchangeOrder; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "GOODS_DETAIL_ID1", nullable = false, insertable = false, updatable = false, referencedColumnName = "ID") 
    public GoodsDetail getGoodsDetail1() { 
     return goodsDetail1; 
    } 

    public void setGoodsDetail1(GoodsDetail goodsDetail1) { 
     this.goodsDetail1 = goodsDetail1; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "GOODS_DETAIL_ID2", nullable = false, insertable = false, updatable = false, referencedColumnName = "ID") 
    public GoodsDetail getGoodsDetail2() { 
     return goodsDetail2; 
    } 

    public void setGoodsDetail2(GoodsDetail goodsDetail2) { 
     this.goodsDetail2 = goodsDetail2; 
    } 

} 

這裏的服務來創建數據

public ExchangeOrder createExchangeOrder(ExchangeOrder domain, List<ExchangeOrderDetail> details, List<BankPayment> bankPayments) { 
     ExchangeOrder newDomain = exchangeOrderDao.saveNew(domain); 
     if (domain != null) { 
      for (ExchangeOrderDetail detail : details) { 
       System.out.println("saving exchange order 2"); 
       if (d.getGoodsDetail2() != null) { 
        detail.setExchangeNumber(newDomain.getExchangeNumber()); 
        detail.setExchangeOrder(newDomain); 
        exchangeOrderDetailDao.saveNew(detail); 
       } 
      } 
      for (BankPayment bp : bankPayments) { 
       bp.setTransactionNumber(domain.getExchangeNumber()); 
       bankPaymentDao.saveNew(bp); 
      } 
     } 
     return newDomain; 
    } 

謝謝你。

回答

0

我看可能會造成這幾個可能的問題:

  1. 任何原因,您同時使用了@ColumnGOODS_DETAIL_ID1也是一個@ManyToOne在同一類GOODS_DETAIL_ID1列註釋的Integer
  2. 由於@Column註釋指出goodsDetail1goodsDetail2的值必須不爲空,但我沒有看到您在您提供的代碼中設置這些值。因此,請嘗試刪除重複的列聲明並確保
  3. 如果正在設置GoodsDetail實體,請確保在保存ExchangeOrderDetail之前保存了它們,因爲沒有明確的級聯保存正在進行。
相關問題