java - 无法在 Springboot/Hibernate 中保存具有 OneToMany 关系的子对象

标签 java spring hibernate jpa spring-boot

我正在 Spring Boot 中构建订单跟踪系统,使用 Hibernate 注释Repositories。我有一个 Order 类,它可以有一个 OrderItems 列表。它们分别映射到 ORDERORDER_ITEMS 表。我代表这两者的代码如下。

Order.java

package net.township.order;


import org.hibernate.annotations.Cascade;

import javax.persistence.*;
import java.util.Date;
import java.util.List;
import java.util.Set;


@Entity
@Table(name = "orders")
public class Order {
    public Order() {
}

public Order(long merchantId, String firstDeliveryName, String 
lastDeliveryName, String deliveryAddress, String status, Date createDate, 
Date updateDate) {
    this.merchantId = merchantId;
    this.lastDeliveryName = lastDeliveryName;
    this.firstDeliveryName = firstDeliveryName;
    this.deliveryAddress = deliveryAddress;
    this.status = status;
    this.createDate = createDate;
    this.updateDate = updateDate;
}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "order_id", unique = true)
private long orderId;

@Column(name = "merchant_id")
private long merchantId;

@Column(name = "first_delivery_name")
private String firstDeliveryName;

@Column(name = "last_delivery_name")
private String lastDeliveryName;

@Column(name = "delivery_address")
private String deliveryAddress;

@Column
private String status;


@OneToMany(mappedBy = "order", cascade = { 
CascadeType.ALL,CascadeType.PERSIST,CascadeType.MERGE })
private List<OrderItem> orderItems;

@Column(name = "create_date")
private Date createDate;


@Column(name = "update_date")
private Date updateDate;


public void setOrderId(long orderId) {
    this.orderId = orderId;
}

public long getMerchantId() {
    return merchantId;
}

public void setMerchantId(long merchantId) {
    this.merchantId = merchantId;
}

public List<OrderItem> getOrderItems() {
    return orderItems;
}

public void setOrderItems(List<OrderItem> orderItems) {
    this.orderItems = orderItems;
}


public String getLastDeliveryName() {
    return lastDeliveryName;
}

public void setLastDeliveryName(String lastDeliveryName) {
    this.lastDeliveryName = lastDeliveryName;
}

public Date getUpdateDate() {
    return updateDate;
}

public void setUpdateDate(Date updateDate) {
    this.updateDate = updateDate;
}

public Long getOrderId() {
    return orderId;
}

public void setOrderId(Long orderId) {
    this.orderId = orderId;
}

public String getFirstDeliveryName() {
    return firstDeliveryName;
}

public void setFirstDeliveryName(String firstDeliveryName) {
    this.firstDeliveryName = firstDeliveryName;
}

public String getDeliveryAddress() {
    return deliveryAddress;
}

public void setDeliveryAddress(String deliveryAddress) {
    this.deliveryAddress = deliveryAddress;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public Date getCreateDate() {
    return createDate;
}

public void setCreateDate(Date createDate) {
    this.createDate = createDate;
}
}

OrderItem.java

package net.township.order;

import com.fasterxml.jackson.annotation.JsonBackReference;
import org.hibernate.annotations.Cascade;

import javax.persistence.*;


@Entity
@Table(name = "order_items")
public class OrderItem {

@Id
@GeneratedValue
@Column(name = "id")
private Long id;

public Long getId() {
    return id;
}

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

public Order getOrder() {
    return order;
}

public void setOrder(Order order) {
    this.order = order;
}

@Column
private String name;

@Column
private String description;

@Column
private Long quantity;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn (name="ORDER_ID")
@JsonBackReference
@Cascade(value={org.hibernate.annotations.CascadeType.ALL})
private Order order;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public Long getQuantity() {
    return quantity;
}

public void setQuantity(Long quantity) {
    this.quantity = quantity;
}
}

当我从我的前端POST 一个新的Order 时,它被正确映射到一个Order 对象。 JSON 中提供的所有 OrderItems 也作为 List 存在于对象中。但是,在我使用 OrderRepository 的保存方法(它只是一个 CrudRepository)将其保存到数据库后,我的数据库包含一个新的 Order具有正确字段的对象,但在 ORDER_ITEMS 中从未创建任何内容。

我已经查看了 Hibernate 和 JPA OneToMany 注释的文档,但我看不出哪里出错了。我还要补充一点,我没有手动创建模式,让 SpringBoot 为我处理 H2 中的所有设置。

最佳答案

这就是最终对我有用的东西。

订单.java

package net.township.order;


import org.hibernate.annotations.Cascade;

import javax.persistence.*;
import java.util.Date;
import java.util.List;
import java.util.Set;


    @Entity
    @Table(name = "orders")
    public class Order {
    public Order() {
    }

    public Order(long merchantId, String firstDeliveryName, String lastDeliveryName, String deliveryAddress, String status, Date createDate, Date updateDate) {
        this.merchantId = merchantId;
        this.lastDeliveryName = lastDeliveryName;
        this.firstDeliveryName = firstDeliveryName;
        this.deliveryAddress = deliveryAddress;
        this.status = status;
        this.createDate = createDate;
        this.updateDate = updateDate;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "order_id", unique = true)
    private long orderId;

    @Column(name = "merchant_id")
    private long merchantId;

    @Column(name = "first_delivery_name")
    private String firstDeliveryName;

    @Column(name = "last_delivery_name")
    private String lastDeliveryName;

    @Column(name = "delivery_address")
    private String deliveryAddress;

    @Column
    private String status;


    @OneToMany( cascade = CascadeType.ALL)
    @JoinColumn(name = "order_id", referencedColumnName = "order_id")
    private List<OrderItem> orderItems;

    @Column(name = "create_date")
    private Date createDate;


    @Column(name = "update_date")
    private Date updateDate;


    public void setOrderId(long orderId) {
        this.orderId = orderId;
    }

    public long getMerchantId() {
        return merchantId;
    }

    public void setMerchantId(long merchantId) {
        this.merchantId = merchantId;
    }

    public List<OrderItem> getOrderItems() {
        return orderItems;
    }

    public void setOrderItems(List<OrderItem> orderItems) {
        this.orderItems = orderItems;
    }


    public String getLastDeliveryName() {
        return lastDeliveryName;
    }

    public void setLastDeliveryName(String lastDeliveryName) {
        this.lastDeliveryName = lastDeliveryName;
    }

    public Date getUpdateDate() {
        return updateDate;
    }

    public void setUpdateDate(Date updateDate) {
        this.updateDate = updateDate;
    }

    public Long getOrderId() {
        return orderId;
    }

    public void setOrderId(Long orderId) {
        this.orderId = orderId;
    }

    public String getFirstDeliveryName() {
        return firstDeliveryName;
    }

    public void setFirstDeliveryName(String firstDeliveryName) {
        this.firstDeliveryName = firstDeliveryName;
    }

    public String getDeliveryAddress() {
        return deliveryAddress;
    }

    public void setDeliveryAddress(String deliveryAddress) {
        this.deliveryAddress = deliveryAddress;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
    }

订单项.java

package net.township.order;

import com.fasterxml.jackson.annotation.JsonBackReference;

import javax.persistence.*;

@Entity
@Table(name = "order_items")
public class OrderItem {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;

    @Column(name = "order_id")
    private Long orderId;

    public Long getId() {
        return id;
    }

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

    @Column
    private String name;

    @Column
    private String description;

    @Column
    private Long quantity;



    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Long getQuantity() {
        return quantity;
    }

    public void setQuantity(Long quantity) {
        this.quantity = quantity;
    }
    }

关于java - 无法在 Springboot/Hibernate 中保存具有 OneToMany 关系的子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45994287/

相关文章:

java - Apache Camel - http 生产者不使用具有丰富模式的 GET 方法

除非指定参数类型,否则 Java 无法编译通用 lambda 参数

java - 使用 ThreadPoolExecutor 在同一线程中的 Runnable 实例之间共享数据

java - 让 @GenerateValue 开始一个具有特定值的序列

java - Gradle 多模块项目编译失败,来自子模块中提到的依赖项的 "classNotFoundExceptions"

java - Java 中的运算符重载(整数包装类)?

spring - 库伯内斯 : Service Accounts Permissions issue with Spring Cloud Data Flow Server

java - Spring TransactionProxyFactoryBean 未加载 dao 服务

java - Spring Boot OAuth 资源服务器代理配置

java - 将值从 Spring 表单传递到另一个 Spring 表单