【问题标题】:one to many relation persisting using spring crud repository使用spring crud存储库保持一对多关系
【发布时间】:2018-01-13 05:26:21
【问题描述】:

我正在尝试保留一个订单实体,其中包含支付实体列表。保存操作是级联的,因此保存订单将保存其中的所有付款。 Order 表有 orderid、price、qty 和 Payment 表有 orderid、paymentid、value、created 和 updated。保存订单时,订单会通过自动生成的 orderid 完美保存,但付款一切正常,除了 orderid 为空。 order 表中的 orderid 应分配给 payment 表中的 orderid。请帮忙。

Order.java

@Entity
@Table(schema="public")
@NamedQuery(name="Order.findAll", query="SELECT o FROM Order o")
public class Order implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int orderid;

    private Integer price;

    private Integer qty;

    //bi-directional many-to-one association to Payment
    @OneToMany(mappedBy="order", fetch=FetchType.EAGER,cascade=CascadeType.ALL)
    private List<Payment> payments;

    public Order() {
    }

    public Integer getPrice() {
        return this.price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    public Integer getQty() {
        return this.qty;
    }

    public void setQty(Integer qty) {
        this.qty = qty;
    }

    public int getOrderid() {
        return orderid;
    }

    public void setOrderid(int orderid) {
        this.orderid = orderid;
    }

    public List<Payment> getPayments() {
        return this.payments;
    }

    public void setPayments(List<Payment> payments) {
        this.payments = payments;
    }

    public Payment addPayment(Payment payment) {
        if(payment!=null){
            payment.setOrder(this);
            getPayments().add(payment);         
        }       

        return payment;
    }

    public Payment removePayment(Payment payment) {
        getPayments().remove(payment);
        payment.setOrder(null);

        return payment;
    }

    @Override
    public String toString() {
        return "Order [orderid=" + orderid + ", price=" + price + ", qty=" + qty + ", payments=" + payments + "]";
    }

}

payment.java

@Entity
@Table(schema="public")
@NamedQuery(name="Payment.findAll", query="SELECT p FROM Payment p")
public class Payment implements Serializable {
    private static final long serialVersionUID = 1L;

    @Temporal(TemporalType.DATE)
    private Date created;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer paymentid;

    @Temporal(TemporalType.DATE)
    private Date updated;

    private Integer value;

    //bi-directional many-to-one association to Order
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="orderid", referencedColumnName="orderid")
    private Order order;

    public Payment() {
    }

    public Date getCreated() {
        return this.created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

    public Integer getPaymentid() {
        return this.paymentid;
    }

    public void setPaymentid(Integer paymentid) {
        this.paymentid = paymentid;
    }

    public Date getUpdated() {
        return this.updated;
    }

    public void setUpdated(Date updated) {
        this.updated = updated;
    }

    public Integer getValue() {
        return this.value;
    }

    public void setValue(Integer value) {
        this.value = value;
    }

    public Order getOrder() {
        return this.order;
    }

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

    @Override
    public String toString() {
        return "Payment [created=" + created + ", paymentid=" + paymentid + ", updated=" + updated + ", value=" + value
                + ", order=" + order + "]";
    }

}

orderController.java

@RestController
public class OrderController {

    @Autowired
    OrderService orderService;
    @Autowired
    PaymentService paymentService;  

    @RequestMapping(method=RequestMethod.PUT, value="/order")
    public void createOrder(@RequestBody Order o){
        System.out.println(o);
        orderService.createOrUpdateOrder(o);
        System.out.println("Order Created");
    }
    @RequestMapping(method=RequestMethod.POST, value="/order")
    public void updateOrder(@RequestBody Order o){
        orderService.createOrUpdateOrder(o);
        System.out.println("Order Updated");
    }

    @RequestMapping(method=RequestMethod.DELETE, value="/order")
    public void deleteOrder(@RequestBody Order o){
        orderService.deleteOrder(o);
        System.out.println("Order Deleted");
    }

    @RequestMapping(method=RequestMethod.PUT, value="/payment")
    public void createPayment(@RequestBody Order o){
        paymentService.createOrUpdatePayments(o);
        System.out.println("Payment Created");
    }
    @RequestMapping(method=RequestMethod.POST, value="/payment")
    public void updatePayment(@RequestBody Order o){
        paymentService.createOrUpdatePayments(o);
        System.out.println("Payment Updated");
    }

    @RequestMapping(method=RequestMethod.DELETE, value="/payment")
    public void deletePayment(@RequestBody Order o){
        paymentService.deletePayments(o);;
        System.out.println("Payment Deleted");
    }
}

orderservice.java

@Service
public class OrderService {

    @Autowired
    OrderRepository orderRepository;

    public void createOrUpdateOrder(Order o){
        orderRepository.save(o);

    }
    public void deleteOrder(Order o){
        orderRepository.delete(o.getOrderid());

    }

    public Order getOrderDetails(Order o){
        return orderRepository.findOne(o.getOrderid());
    }
}

OrderRepository.java

@Repository
public interface OrderRepository extends CrudRepository<Order, Integer> {
}

输出:

Order Table

Payment table where orderid is null

【问题讨论】:

  • 你能分享一下你是怎么存钱的吗?
  • 我已经在post amer中添加了。
  • 迭代Payment列表并对每个payment执行setOrder(order);
  • 我会在哪里做呢?
  • 您也可以在服务或道中做...显示您的保存代码Order

标签: hibernate spring-mvc spring-boot annotations spring-data-jpa


【解决方案1】:

您可以在服务的createOrUpdateOrder 中试试这个并告诉我
也许你能找到比这更好的

public void createOrUpdateOrder(Order o){
    List<Payment> payments = new ArrayList<>();
    for( Payment payment : order.getPayments() ) {
        payment.setOrder( order );
        payments.add(payment);
    }
    order.setPayments( payments );
    orderRepository.save(o);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2021-05-14
    • 2020-11-28
    • 2019-05-06
    • 2017-06-29
    • 2021-08-08
    • 2021-05-27
    相关资源
    最近更新 更多