【问题标题】:Find total price for an order using JPA使用 JPA 查找订单的总价
【发布时间】:2018-09-14 19:16:03
【问题描述】:

我有一个带有实体图的 JPA 应用程序,它显示了订单和客户之间的关系。

我有一个 ItemType 实体类:

@Entity
public class ItemType implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private String description;
private int price;
List<OrderLine> orderlines;

该类包含一个 OrderLines 列表,因为它与 orderline 实体具有一对多的关系。

这是我的 OrderLine 实体。由于关系,它包含 ItemType 类的单个实例。

@Entity
public class OrderLine implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private int quantity;
private Order order;
private ItemType itemtype;

我有一个外观类,我在其中创建了不同的方法来计算和选择我的数据库中的元素,但我想创建一个 calculatePrice 方法,它将订单行中的数量与 ItemType 中的价格相乘。

我知道函数需要同时采用 ItemType 实例和 OrderLine 实例,如下所示:

 public int getTotalPrice(ItemType itemtype, OrderLine orderline){


}

但我不确定是否应该在实体类中使用 NamedQueries 从数据库中获取数据,或者我应该使用可以进行计算的值注释之类的东西。

【问题讨论】:

  • 我不认为这是基于主要意见的问题。使用 Query 或使用 Hibernate 会话会产生直接后果,并且根据上下文具有不同类型的优势。我投票反对为此目的关闭它。
  • 这里没有更好的做法。在 99% 的情况下,最好选择最干净、最易读的选项。有时,当您使用 Hibernate Session 在其缓存上大量中继的应用程序时效率更高,因为与使用查询时相比,您将在缓存上获得更多命中。当您使用查询时,您会转移数据库上的负载。这并不是一件坏事!
  • 我认为所有的努力真的不值得。仅当您希望学习更多休眠功能时才值得这样做 :) 正如我所说,在一般情况下,这里没有不好的选择。
  • 不,你不能那样做。您希望能够读取该属性。如果您选择 Java 版本,则根本不需要维护属性。只需在 OrderLine calculateTotalPrice 中执行一种方法,使用“this”从 ItemType 中获取值执行计算并返回结果。工作完成。
  • 如果此方法位于您的 OrderLine 中,则根本不需要向该方法传递参数

标签: java hibernate jpa orm hibernate-mapping


【解决方案1】:

这两个选项都有效,各有优缺点。

如果将其定义为 Query,您将获得更少的 java 代码。查询将绑定到您的实体,以一种不那么冗长的方式。

另一方面,您将无法利用休眠会话提供的 1 级缓存。如果您配置了二级查询缓存,那么缓存结果的唯一方法是通过二级查询缓存,但这种缓存仍然不是很好。

如果您决定使用 java,您将充分利用 Hibernate Session 及其功能。您将可以很好地控制查询的执行频率。您将能够调试您的 Java 代码。您将能够对其进行单元测试。

您的选择总结:

  1. 使用查询,从您的服务中调用它。
  2. 使用公式,这样您就不需要调用查询,而是在加载实体后,您的公式将得到评估。
  3. 执行一个遍历树并计算值的 java 方法。在缓存密集型应用程序中,这是性能最高的方法,也很容易进行单元测试。

【讨论】:

  • 完美,非常感谢。因此,如果我想使用 java,我可以对主要数据类型进行值注释,以进行计算,并在我的方法中使用它?
猜你喜欢
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多