Hibernate 从外部事务类中的 getCurrentPrice 返回 null

Posted

技术标签:

【中文标题】Hibernate 从外部事务类中的 getCurrentPrice 返回 null【英文标题】:Hibernate returns null from getCurrentPrice in outer transactional class 【发布时间】:2018-10-04 13:47:17 【问题描述】:

但是新的 get by id 调用返回的是正常当前价格的产品。

如何解决这个问题?

这是我的产品类

@Table(name = "products")
public class Product //...
@OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
private Set<OrderItem> orderItems = new HashSet<>();

还有订单项

@Table(name = "orderItems")
public class OrderItem extends BaseModel //...
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "productId")
private Product product;

@Column
private double currentPrice;

和DAO

@Repository
@Transactional
public class HibernateOrderDao //...
public Serializable save(Order order) 
    order.getReceiver().getOrdersToReceive().add(order);
    order.getItems().forEach(item -> 
        item.setOrder(order);
        item.getProduct().getOrderItems().add(item);//todo improve by direct sql or...!
    );
    order.getAddresses().forEach(address -> address.getOrders().add(order));

    return super.save(order);

但在外部事务方法中 getCurrentPrice 返回 null

  private Double calculateItemsCost(final OrderItem item) 
    return item.getProduct().getCurrentPrice()
            * item.getQuantity();

【问题讨论】:

【参考方案1】:

如果你能看到产品的id,请尝试拨打Product product = productService.findById(item.getProduct().getId()),然后拨打item.setProduct(product)

【讨论】:

在 item.getProduct().getOrderItems().add(item) 之后;在调试价格也是0 这会起作用,但据我所知,如果没有这个,它应该可以正常运行。 我不知道数据库中的列是否可以有大写字母,尝试如下:@JoinColumn(name = "productid")

以上是关于Hibernate 从外部事务类中的 getCurrentPrice 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

从外部类修改基类中的内容并从派生类访问它

day09内部类

使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)

从外部类 C++ 正确调用嵌套类中的函数

day36-hibernate检索和优化 09-Hibernate中的事务:事务处理

Hibernate中的事务与并发