繁体   English   中英

通过JPA注释的聚合关系

[英]Aggregation relationship via JPA annotations

我试图通过JPA注释在两个Java类之间建立聚合关系,以将它们持久化到数据库中。

在此处输入图片说明

public class Ticket 
{
    private String ticketNo;
    private Date releasedDate;
    private boolean printed;
}

public class Discount 
{
    private String percentage;
    private Date releasedDate;
    private boolean printed;
}

如提到这里 ,聚合关系是单向的,因此,只有必要一边进行映射。 从此页面给出的解决方案中,我认为解决方案将是:

 public class Discount 
    {
        private String percentage;
        private Date releasedDate;
        private boolean printed;
        @ManyToOne(name="TICKET_ID")
        private Ticket ticket;
    }

但是,在聚合的一些示例中,多边类出现在一个边类内。 因此,我也在考虑这一点:

 public class Ticket 
        {
            private String ticketNo;
            private Date releasedDate;
            private boolean printed;
            @OneToMany(mappedBy="ticket")
            private List<Discount> discounts = new ArrayList<Discount>();
        }

哪个选项是合适的?

在我看来,这很对。 折扣有票。 如果您需要在查询中访问SELECT t FROM Ticket t WHERE t.discounts.percentage >= :discountPercentage例如SELECT t FROM Ticket t WHERE t.discounts.percentage >= :discountPercentage还可以包括可从ticket.getDiscounts()等门票获得的SELECT t FROM Ticket t WHERE t.discounts.percentage >= :discountPercentage

@Entity
public class Ticket {
    @Id
    private String ticketNo;
    private Date releasedDate;
    private boolean printed;

    @OneToMany(mappedBy = "ticket", fetch = FetchType.LAZY)
    private List<Discounts> discounts;
}

@Entity
public class Discount {
       private String percentage;
       private Date releasedDate;
       private boolean printed;

       @ManytoOne(name="TICKET_ID")
       private Ticket ticket;
}

但是,我不建议使用@OneToMany因为如果您将其作为JSON结果返回或只是由于意外而懒惰地加载了太多数据,可能会导致将太多数据序列化为JSON时出现问题。 如果您未将@OneToMany关联查询设为SELECT t FROM Discount d INNER JOIN d.ticket t WHERE d.percentage >= :discountPercentage应该始终可以仅使用@ManyToOne作为示例。

这是您映射单向多对一关系的方式:

@Entity
public class Ticket {
    @Id
    @GeneratedValue
    private Long id;

    private String ticketNo;
    private Date releasedDate;
    private boolean printed;

    // getters and setters
}

@Entity
public class Discount {
    @Id
    @GeneratedValue
    private Long id;

    private String percentage;
    private Date releasedDate;
    private boolean printed;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "TICKET_ID")  // you can rename the join column 
    private Ticket ticket;

    // getters and setters
}

注意:

  • JoinColumn(数据库术语中的外键)必须位于关系的多个方面(在您的情况下为Discount)。
  • @Id注释也是必需的。 在这种情况下,ID将由持久性提供程序自动生成。 如果使用数据库序列或表或其他策略,则可以重新定义它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM