无法插入带有复合主键的表

时间:2019-06-27 17:40:09

标签: spring-boot composite-primary-key hibernate-5.x

这是我主表的表结构

@Entity
@Table(name = "POrderListMast")
public class SalesOrder {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "OMN_ID", nullable = false)
    private long id;

    @JsonSerialize(using = DateTimeSerializer.class)
    @Column(name = "OMD_DATE", columnDefinition = "DATETIME", nullable = false, updatable = false)
    @CreationTimestamp
    private LocalDateTime date;

    @Column(name = "CUSTOMERID")
    private int customerId;

    @Column(name = "OMN_USERCODE")
    private int salesManId;

    @Column(name = "OMN_PRCGROUPID")
    private int priceGroupId;

    @Column(name = "CCODE")
    private int Ccode = 1;

    @Column(name = "OMN_TOTTAX", columnDefinition = "MONEY")
    private BigDecimal totalTax;

    @Column(name = "OMN_TOTAMT", columnDefinition = "MONEY")
    private BigDecimal totalAmount;

    @Column(name = "OMN_REFNO")
    private String refNumber;

    @Column(name = "omc_remarks")
    private String remarks;

    @Column(name = "omc_deviceid")
    private String deviceId;

    @Cascade({ CascadeType.SAVE_UPDATE })
    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "OMN_ID")
    private List<SalesOrderDetail> orderDetails;

}

这是可嵌入的ID表

@Embeddable
public class SalesDetailsId implements Serializable {

    private static final long serialVersionUID = 1L;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "OMN_ID", columnDefinition = "BIGINT")
    private SalesOrder salesOrderMaster;

    @Column(name = "ODN_SLNO", columnDefinition = "BIGINT")
    private int slNo;

}

和使用嵌入式ID的表

@Entity
@Table(name = "POrderListDetl")
public class SalesOrderDetail {

    @EmbeddedId
    private SalesDetailsId salesDetailsId;

    @Column(name = "ODC_BARCODE")
    private String barcode;

    @Column(name = "ODN_ITEMMASTID")
    private long itemId;

    @Column(name = "ODN_UNITID")
    private int unitId;

    @Column(name = "ODN_QTY", columnDefinition = "FLOAT")
    private int quantity;

    @Column(name = "ODN_RATE", columnDefinition = "MONEY")
    private BigDecimal rate;

    @Column(name = "ODN_VATPER", columnDefinition = "NUMERIC(18,2)")
    private double vatPercentage;

    @Column(name = "ODN_VATAMT", columnDefinition = "MONEY")
    private BigDecimal vatAmount;

    @Column(name = "ODN_AMT", columnDefinition = "MONEY")
    private BigDecimal netAmount;

}

这是我用于网络服务的json正文

{
  "date": "2019-06-27T02:54:13.288",
  "customerId": 1,
  "salesManId": 1,
  "priceGroupId": 1,
  "totalTax": 0.624,
  "totalAmount": 13.104,
  "refNumber": "NZR",
  "orderDetails": [
    {
      "salesDetailsId": {
        "slNo": 1
      },
      "barcode": "701948177570",
      "itemId": 550,
      "unitId": 1,
      "quantity": 2,
      "rate": 3.25,
      "vatPercentage": 5,
      "vatAmount": 0.325,
      "netAmount": 6.825
    }
  ]
}

当我尝试使用以下代码保存此

@Transactional
    public Response<Long> saveSalesOrder(SalesOrder salesOrder) {
        Session session = entityManager.unwrap(Session.class);
        session.saveOrUpdate(salesOrder);
        return new ResponseUtil().createResponse((Long) session.getIdentifier(salesOrder));
    }

它正在扔

  

ConstraintViolationException:无法执行语句

     

原因:com.microsoft.sqlserver.jdbc.SQLServerException:无法将值NULL插入表'POrderListDetl'的'OMN_ID'列中;列不允许为空。 INSERT失败。

如果我删除salesDetailsId对象并直接添加slno,则显示另一个异常

  

org.hibernate.id.IdentifierGenerationException:为以下类生成的空ID:SalesOrderDetail

我的代码有什么问题?

0 个答案:

没有答案