java - JPA (hibernate) 按字段映射子对象

标签 java spring hibernate jpa

编辑:对于那些将来可能经过这里的人,我想分享我发现的东西。虽然它不适用于这种特定情况,但 hibernate 确实有一个 @Where 注释。通过此注释,您可以拥有 N 个集合。每组都有@Where(clause='column=value')。我不会使用 @Where 解决方案,但它可能适合你。

我是 JPA Hibernate 的新手,正在寻求一些帮助。我也不一定知道要搜索什么,所以这是我的问题的一个简单示例。

我需要获取一个 Set 并根据字段的值将其拆分为多个 Set。

让我们看一些简单的事情:

public class Customer{
    private String name;
    private String age;
    private Set<Order> orders;
}

public class Order{
    private int amount;
    private String status;
}

目标:我希望 Hibernate 将客户的订单按状态拆分为单独的集合。目前,我使用 @POSTLOAD 注释来循环 Set 并相应地将它们分开。我更希望 Hibernate 为我做这件事,结果如下:

public class Customer{
    //Irrelevant stuff from above...

    private Set<Order> pendingOrders;
    private Set<Order> completedOrders;
    private Set<Order> canceledOrders;
}

这些集合将基于订单的状态。

  • pendingOrders 是 Order.getStatus() == "PENDING"
  • completedOrders 是 Order.getStatus() == "COMPLETED"
  • canceledOrders 是 Order.getStatus() == "CANCELED"

这些表直接由类表示,并且都被视为“实体”。 (客户和订单)

如果我没有提供足够的信息,您能否指出我对我“试图”完成的任务进行正确的搜索。就 JPA 术语而言,我不知道要搜索什么,并且确实需要一些帮助!

谢谢!

最佳答案

针对您的情况,最好的方法是创建一个鉴别器列和一些额外的类来使用它。示例

@Entity
@Table(name = "ORDER")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "STATUS", discriminatorType = DiscriminatorType.STRING)
public abstract class Order{
}


@Entity
@DiscriminatorValue(value = "PENDING")
public class PendingOrder extends Customer {

}

public class Customer{
    //Irrelevant stuff from above...

    private Set<PendingOrder> pendingOrders;
    //same fo0r all others types
}

如果您发现订单有一些仅对待处理订单或已完成订单有效的特定信息,那么最好的方法可能是使用

@Inheritance(strategy = InheritanceType.JOINED)

或者

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

并在这些新表中添加特定列

关于java - JPA (hibernate) 按字段映射子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45417549/

相关文章:

Java项目配置

java - 如何复用单声道助焊剂值(value)?

hibernate - Grails:未刷新的 session 和回滚的交易之间有什么区别?

java - hibernate 列表警告;

java - spring中的数组依赖注入(inject)?

java - 不模拟方法,而是调用原始方法(mockito)

java - 为目录中的每个文件创建 JButton

c# - Shell 脚本与高级解释语言(C#/Java/等)的性能比较

unit-testing - 如何覆盖 Spring @Autowired 的行为

java - 在 hibernate 中插入实体问题