两个 类 之间的两个 "One to One" 关系

Two "One to One" relationships between two classes

我有实体 Customer 和实体 Ticket

Customer 可以有两张不同的票。 List of Tickets 和 OneToMany 关系不适合那里,因为我应该在 Customer 实体中有两个不同的字段用于票证:ownTicketrefererTicket。请帮我实现这个关系。怎么做到的?

有什么问题?

您可以轻松地将客户创建为:

public class Customer{
  ....
  @OneToOne
  Ticket ownTicket;

  @OneToOne
  Ticket refererTicket;
  ....
}

你可以有两个一对一的关系,像这样:

class Costumer {
    @OneToOne
    Ticket ownTicket;

    @OneToOne
    Ticket refererTicket;
}

只是给不同的名字。然后,在 Ticket class 中,如果你想双向映射,我相信你必须使用 mappedBy 属性:

class Ticket {
    @OneToOne(mappedBy="ownTicket")
    Costumer owner;

    @OneToOne(mappedBy="refererTicket")
    Costumer referer;
}

如果Ticket只能有一个Costumer,那么我会这样做:

创建关系 class,称为 TicketCostumer 或其他名称:

class TicketCostumer {
    @OneToOne
    Ticket ticket;

    @ManyToOne
    Costumer costumer;

    Type type;
}

其中 Type 是您创建的具有 OWNER 和 REFERER 的枚举;

现在每张票只能有一张:

class Ticket {
    @OneToOne
    CostumerTicket ct;
}

最后,在 Costumer 上,您可以决定如何处理事情;您可以有一个列表并手动保证每种类型不超过一个(或尝试使用 @UniqueBy 或类似的东西),或者您可以有两个单独的字段来控制它。

您应该将其映射为 @OneToMany 但隐藏此实现细节。这可能如下所示:票证有一个额外的列指示其类型。

@Entity
public class Customer {

    @OneToMany
    @JoinColumn(name = "customer_id")
    @MapKeyColumn(name = "ticket_type")
    @MapKeyEnumerated(EnumType.String)
    private Map<TicketType, Ticket> tickets;

    // we will not expose the tickets collection
    // the fact it is a @OneToMany is then transparent to all client code

    public Ticket getOwnTicket(){
        return tickets.get(TicketType.O);
    }

    public Ticket getReferrerTicket(){
        return tickets.get(TicketType.R); 
    }

    public void setOwnTicket(Ticket ticket){
        //ticket.setType(TicketType.O); //may not be required
        tickets.put(TicketType.O, ticket);
    }

    public void setReferrerTicket(Ticket ticket){
        //ticket.setType(TicketType.R); //may not be required
        tickets.put(TicketType.R, ticket);
    }
}