我有一個 Hibernate + Spring Boot 應用程序,并且在通過添加子項來更新父項時收到 IntegrityConstraintViolationException。數據庫架構是:table order ( id (primary key auto generated),);table order_line ( order_id (primary key + foreign key to order.id), order_line_id (primary key set manually set in the code),)在java中:@Getter@Setter@Entity(name = "ORDER")public class Order { @Id @GeneratedValue(strategy= GenerationType.AUTO) private Integer id;@Getter@Setter@Entity(name = "ORDER_LINE")public class OrderLine implements Serializable{ @Id private Integer orderLineId; @Id @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(referencedColumnName = "id", columnDefinition = "Integer", insertable = false, updatable = false) private Order order;要創建訂單,我使用 JpaRepository 并創建我的對象,如下所示: Order order = new Order(); order.setId(118); //This is an existing order ID which should be updated Set<OrderLine> orderLines = new HashSet<OrderLine>(); OrderLine orderLine = new OrderLine(); orderLine.setOrderLineId(0); //This is an existing order line orderLine.setOrder(order); orderLines.add(orderLine); orderLine = new OrderLine(); orderLine.setOrderLineId(1); //This is a non-existing order line orderLine.setOrder(order); orderLines.add(orderLine); order.setOrderLines(orderLines); orderRepository.save(order);for (OrderLine orderLine : order.getOrderLines()) { orderLine.setOrder(order);}orderRepository.save(order);這段代碼的作用是:創建具有 0、1 或更多孩子的新父母(意思是,我沒有設置 orderId)更新父字段和/或任何子字段(在上面的示例中,如果我不添加第二個 orderLine,一切正常)刪除子行但是不起作用的是向現有父級添加一行。這會導致以下異常:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:sun.reflect.NativeConstructorAccessorImpl.newInstance0(本機方法)的列“ORDER_LINE_ID”不能為空我不明白,因為我可以清楚地看到每個 OrderLine 對象的 orderLineId 設置正確。我究竟做錯了什么?
1 回答

藍山帝景
TA貢獻1843條經驗 獲得超7個贊
如果您想將 order_id 和 order_line_id 作為 OrderLine 實體中的復合鍵,則需要創建@Embeddable第一個:
@Embeddable
public class OrderLinePK implements Serializable {
private Integer orderId;
private Integer orderLineId;
}
并在您的 OrderLine 實體中將其更改為
@EmbeddedId
private OrderLinePk pk;
@MapsId("orderId")
@ManyToOne
private Order order;
現在每次您需要創建一個新的 OrderLine 時,您都必須創建一個主鍵對象并像這樣分配 ID
OrderLine orderLine = new OrderLine();
OrderLinePK pk = new OrderLinePK();
pk.setOrderLineId(11);
orderLine.setPk(pk);
orderLine.setOrder(order);
希望這可以幫助。
添加回答
舉報
0/150
提交
取消