Это моя структура таблицы для мастер-таблицы
@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;
}
это встраиваемая таблица идентификаторов
@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;
}
и таблица с использованием встроенного идентификатора
@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 в столбец 'OMN_ID', таблица 'POrderListDetl'; столбец не допускает пустых значений. INSERT не работает. `
если я удаляю объект salesDetailsId
и добавляю slno
напрямую, он показывает еще одно исключение
org.hibernate.id.IdentifierGenerationException: пустой идентификатор, сгенерированный для: класса SalesOrderDetail
Что не так с моим кодом?