使用 JPA 查找订单的总价
Find total price for an order using JPA
我有一个带有实体图的 JPA 应用程序,它显示了订单和客户之间的关系。
我有一个 ItemType 实体 class 这样的:
@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;
class 包含订单行列表,因为它与订单行实体具有一对多关系。
这是我的 OrderLine 实体。由于关系,它包含 ItemType class 的单个实例。
@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;
我有一个门面 class,我在其中使用了不同的方法来计算和 select 来自我的数据库的元素,但我想制作一个 calculatePrice 方法,它将来自带有 ItemType 价格的订单行。
我知道函数需要同时采用 ItemType 实例和 OrderLine 实例,如下所示:
public int getTotalPrice(ItemType itemtype, OrderLine orderline){
}
但我不确定是否应该在实体 classes 中使用 NamedQueries 从数据库中获取数据,或者我应该使用可以进行计算的值注释之类的东西。
两个选项都有效,各有优缺点。
如果将其定义为Query,您将获得更少的java代码。查询将绑定到您的实体,以一种不那么冗长的方式。
不利的一面是您将无法利用休眠会话提供的 1 级缓存。缓存结果的唯一方法是通过二级查询缓存(如果您配置了它),但这种类型的缓存仍然不是很好。
如果您决定使用 java,您将充分利用 Hibernate Session 及其功能。您将可以很好地控制查询执行的频率和频率。您将能够调试 Java 代码。您将能够对其进行单元测试。
您的选择摘要:
- 使用查询,从您的服务调用它。
- 使用公式,这样您就不需要调用您的查询,而是在您加载实体后对您的公式进行评估。
- 执行遍历树并计算值的 java 方法。在缓存密集型应用程序中,这是性能最高的方法,而且单元测试也很容易。
我有一个带有实体图的 JPA 应用程序,它显示了订单和客户之间的关系。
我有一个 ItemType 实体 class 这样的:
@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;
class 包含订单行列表,因为它与订单行实体具有一对多关系。
这是我的 OrderLine 实体。由于关系,它包含 ItemType class 的单个实例。
@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;
我有一个门面 class,我在其中使用了不同的方法来计算和 select 来自我的数据库的元素,但我想制作一个 calculatePrice 方法,它将来自带有 ItemType 价格的订单行。
我知道函数需要同时采用 ItemType 实例和 OrderLine 实例,如下所示:
public int getTotalPrice(ItemType itemtype, OrderLine orderline){
}
但我不确定是否应该在实体 classes 中使用 NamedQueries 从数据库中获取数据,或者我应该使用可以进行计算的值注释之类的东西。
两个选项都有效,各有优缺点。
如果将其定义为Query,您将获得更少的java代码。查询将绑定到您的实体,以一种不那么冗长的方式。
不利的一面是您将无法利用休眠会话提供的 1 级缓存。缓存结果的唯一方法是通过二级查询缓存(如果您配置了它),但这种类型的缓存仍然不是很好。
如果您决定使用 java,您将充分利用 Hibernate Session 及其功能。您将可以很好地控制查询执行的频率和频率。您将能够调试 Java 代码。您将能够对其进行单元测试。
您的选择摘要:
- 使用查询,从您的服务调用它。
- 使用公式,这样您就不需要调用您的查询,而是在您加载实体后对您的公式进行评估。
- 执行遍历树并计算值的 java 方法。在缓存密集型应用程序中,这是性能最高的方法,而且单元测试也很容易。