【问题标题】:Getting Entity But null value properties in Hibernate在 Hibernate 中获取实体但为空值的属性
【发布时间】:2020-06-09 07:43:57
【问题描述】:

我通过代码获取实体并使用 Hibernate 从 Db 获取结果。 该值存在,但所有属性都显示为 null,如果我尝试使用返回的 Entity 对象属性值的属性,则这些属性值为 NULL。但价值确实存在。

Order 和 Cart 扩展了一个具有公共属性的抽象类。 所以下面是我拥有的实体和代码。

@MappedSuperclass
@Getter @Setter
 public class AbstractOrder implements Serializable {

  @OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST)
  @JoinColumn(name = "DeliveryAddressID")
  private Address deliveryAddress;

  @OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST)
  @JoinColumn(name = "BillingAddressID")
  private Address billingAddress;
  ....
  ....

 }

 public Order cloneCartToOrder(String cartCode,String sellerId) {
    Cart cart = cartDao.findByCode(cartCode);
    Order order=getOrderDetails(cartCode);
    List<PromotionResult> promotionResults = null;
    if(order==null) {
        order = modelMapper.map(cart, Order.class);
        order.setOrderDate(new Date());
        order.setCode(cart.getCode());
        order.setStatus("Open");
        order.setHowWasOrderConfirmed(HowOrderConfirmStatus.ESALE);
        setOrderAddress(order, cart);
        promotionResults = order.getPromotionResults().stream().map(promotionResult -> {
   ..........
   ..........
   ..........

}

private void setOrderAddress(Order order, Cart cart) {
    Address address = addressDao.getAddressById(cart.getBillingAddress().getId());
    if (order.getShippingSameAsInvoice()) {
        Address billAddress = createNewAddressForOrder(address);
        order.setBillingAddress(billAddress);
        order.setDeliveryAddress(billAddress);
    } else {
        Address billAddress = createNewAddressForOrder(address);
        Address deliveryAddress = createNewAddressForOrder(addressDao.getAddressById(cart.getDeliveryAddress().getId()));
        order.setBillingAddress(billAddress);
        order.setDeliveryAddress(deliveryAddress);
    }
}

private Address createNewAddressForOrder(Address address ) {
    Address newAddress = new Address();
    newAddress.setBusinessPhone(address.getBusinessPhone());
    newAddress.setCountry(address.getCountry());
    newAddress.setCompany(address.getCompany());
    newAddress.setEmail(address.getEmail());
    newAddress.setFirstName(address.getFirstName());
    newAddress.setLastName(address.getLastName());
    newAddress.setHomePhone(address.getHomePhone());
    newAddress.setIsBillingAddress(address.getIsBillingAddress());
    newAddress.setIsShippingAddress(address.getIsShippingAddress());
    newAddress.setLatitude(address.getLatitude());
    newAddress.setLongitude(address.getLongitude());
    newAddress.setMobile(address.getMobile());
    newAddress.setPostCode(address.getPostCode());
    newAddress.setState(address.getState());
    newAddress.setStreetAddress1(address.getStreetAddress1());
    newAddress.setStreetAddress2(address.getStreetAddress2());
    newAddress.setSuburb(address.getSuburb());
    newAddress.setTitle(address.getTitle());
    newAddress.setZone(address.getZone());
    return newAddress;
}

所以如果你看到这里我从第一个方法调用这个 setOrderAddress(order, cart); 方法。然后将地址填充到新对象以将其保存为新地址。但是保存后我可以看到我新创建的所有值都保存为 Null 只有使用 ID 创建的地址。

从 IDE 进行检查时请查看 PFA。

【问题讨论】:

  • 代码在哪里?
  • @Andronicus 我添加了代码。请检查一下。
  • 请粘贴 OrderCart 实体
  • @Andronicus 我已经包含了代码。请看一下。谢谢

标签: java spring hibernate spring-data-jpa hibernate-mapping


【解决方案1】:

实体是延迟获取的(FetchType.LAZY),您必须让它们急切(FetchType.EAGER),或者,如果您关心这种情况下的性能,您可以编写自己的查询以将它们与父实体一起获取.

【讨论】:

  • 像显式 DB 调用一样根据购物车或订单获取地址?
  • @Sachi-17 这是个问题吗?我不明白
  • 是的,只是为了确认。
  • @Sachi-17 是的,您可以在单独的查询中获取它,但这有点慢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
相关资源
最近更新 更多