两个"一对一"两个班级之间的关系

时间:2017-04-21 16:57:42

标签: java jpa one-to-many one-to-one

我有实体Customer和实体Ticket

Customer可以有两张不同的门票。 List门票与OneToMany关系不合适,因为Customer实体中我应该有两个不同的字段用于门票:ownTicketrefererTicket。请帮我实现这种关系。怎么做?

3 个答案:

答案 0 :(得分:2)

你可以有两个一对一的关系,如下:

class Costumer {
    @OneToOne
    Ticket ownTicket;

    @OneToOne
    Ticket refererTicket;
}

只是给出不同的名字。然后,在Ticket类中,如果你想要两种方式映射,我相信你必须使用mappedBy属性:

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

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

如果Ticket只有一个Costumer,那么这就是我要做的事情:

创建一个名为TicketCostumer的关系类:

class TicketCostumer {
    @OneToOne
    Ticket ticket;

    @ManyToOne
    Costumer costumer;

    Type type;
}

如果Type是您创建的具有OWNER和REFERER的枚举;

现在每张票只能有一张:

class Ticket {
    @OneToOne
    CostumerTicket ct;
}

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

有什么问题?

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

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

  @OneToOne
  Ticket refererTicket;
  ....
}