【问题标题】:JPA (hibernate) mapping child objects by fieldJPA(休眠)按字段映射子对象
【发布时间】:2018-01-07 02:58:28
【问题描述】:

编辑:对于那些将来可能会经过这里的人,我想分享一些我发现的东西。尽管它不适用于这种特定 情况,但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 术语而言,我不知道要搜索什么并且真的可以使用一些帮助!

谢谢!

【问题讨论】:

标签: java spring hibernate jpa


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的帮助。我会进一步研究它。我认为它会起作用!
猜你喜欢
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
相关资源
最近更新 更多