[英]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
}
注意:
@Id
注释也是必需的。 在这种情况下,ID将由持久性提供程序自动生成。 如果使用数据库序列或表或其他策略,则可以重新定义它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.