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

时间:2017-07-31 13:39:18

标签: java spring hibernate jpa

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

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

我需要取一个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()==“CANCELLED”
  • 的地方

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

如果我没有提供足够的信息,请指点我正确搜索我“想要”完成的事情。就JPA术语而言,我不知道要搜索什么,可以真正使用一些帮助!

谢谢!

1 个答案:

答案 0 :(得分:2)

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

@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)

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