繁体   English   中英

如何在Spring Data JPA或Hibernate中存储实体

[英]How to store entities in Spring Data JPA or hibernate

我有这两个entities ,它们使用OnetoMany映射相互OnetoMany

实体:

@Table(name = "table_A")
public class UserSum{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false, unique = true)
    private Long id;
    private String order_id;
    private Date order_date;
    @Column(name="email_address")
    private String emailAddress;

    @OneToMany(mappedBy="userOrderID",fetch=FetchType.EAGER, cascade = CascadeType.ALL)
    private Collection<OrderSummary> orderSummary;
        // Getter and Setters

    }


     @Entity
     @Table(name = "table_B")
     public class AlphaSumm {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "id", nullable = false, unique = true)
        private Long id;
        @Column(name="user_orders_id",nullable = true)
        private Long userSumID; 
        @Column(name="total_price")
        private String  totalPrice;
            // Getter and setters

        }

要求:我要保存UserSum和AphaSum。

问题:

我正在尝试这样的事情

private void save(Order order){
    UserSum usersum = new UserSum();
    usersum.setOrder_id(order.getOrder_id());
    usersum.setOrderSummary(getAllOrdersSummary(order,userOrders));
    userOrdersRepository.save(userOrders);
}

private OrderSummary processOrderSummary(Item item,UserOrders userOrders){
    OrderSummary orderSummary= new OrderSummary();

    // Some code here  
    orderSummary.setUserOrderID(userOrders.getId());  
    return orderSummary;
    }

注意:UserOrder是实体

但是我在数据库中得到userOrderID为空。

我的理解是:我在这里显式设置id orderSummary.setUserOrderID(userOrders.getId());

但此处为null,因为JPA /休眠会在保存数据后立即创建ID,因此我该如何映射它们。 我想到的一种解决方案是这样的

userOrders = userOrdersRepository.save(userOrders);  // to get the id and then perform rest of the operation.
userOrders.setOrderSummary(getAllOrdersSummary(order,userOrders));
userOrdersRepository.save(userOrders);

但我很确定这不是正确的方法。 请提供您的意见,如果我身边缺少什么,请告诉我。

更新

private List<OrderSummary> getAllOrdersSummary(Order order,UserOrders userOrders ){
    List<OrderSummary> orderSummary=new ArrayList<OrderSummary>();
    //some logic
    orderSummary.add(processOrderSummary(item,userOrders));
    return orderSummary;
}

private OrderSum processOrderSum(Item item,UserSum usersum){
    OrderSum orderSum= new OrderSum();
    orderSum.setOrderItems(item.getName());
    orderSum.setTotalPrice(NumberFormating.currencyFormat(item.getPrice()));
    orderSum.setQuantity(NumberFormating.numberFormat(item.getQty()));
    orderSum.setUserOrderID(usersum.getId()); 

    return orderSum

我认为您需要像这样更改OrderSummary实体:

@Table(name = "table_B")
public class OrderSummary {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false, unique = true)
    private Long id;

    @ManyToOne(fetch = FetchType.Lazy)
    @JoinColumn(name="id")
    private UserOrders userOrders;  

    @Column(name="total_price")
    private String  totalPrice;

}

试一试。

并且请在这里看看: pa-joincolumn-vs-mappedby

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM