![](/img/trans.png)
[英]Spring Data jpa (hibernate) nullpointer Exception when adding List of Entities
[英]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.