2017-07-31 57 views
1

编辑:对于未来可能经过这里的人,我想分享一些我发现的东西。虽然它不适用于这种情况,但hibernate确实有一个@Where注释。有了这个注解,你可以有N个集合。每个集合都有@Where(clause ='column = value')。我不会使用@Where解决方案,但它可能适合您。JPA(休眠)按字段映射子对象

我是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; 
} 

目标:我想有休眠分裂我的客户的订单通过他们的身份进入单独设置。目前我使用@POSTLOAD注释来遍历Set并将它们分开。我宁愿休眠做到这一点对我产生这样的:

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

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

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

  • pendingOrders是其中Order.getStatus()其中Order.getStatus()== “已完成”
  • canceledOrders == “待定”
  • completedOrders是被其中Order.getStatus()==“取消“

这些表直接由类表示,并且都被认为是‘实体’。 (客户和订单)

如果我没有提供足够的信息,可否请您指出我正在“尝试”完成什么的正确搜索。在JPA术语方面,我不知道要搜索什么内容,并且可以真正使用一些帮助!

谢谢!

+0

添加特定的列有一个看看discrimator办法https://开头计算器。com/questions/14327706/spring-data-jpahibernate-how-do-i-retrieve-a-concrete-entity-using-only-a-fie。你可以有一个带有鉴别器列的简单表格,根据鉴别器列 – kimy82

回答

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(策略= InheritanceType.JOINED)

或者

@Inheritance(策略= InheritanceTyp e.TABLE_PER_CLASS)

而且在这些新表

+0

将数据库中的原始对象映射到不同的对象。谢谢你的帮助。我会进一步研究它。我认为它会起作用! – Paul