package com.sap.hana.cloud.samples.benefits.persistence.model; import static com.sap.hana.cloud.samples.benefits.persistence.model.DBQueries.GET_USER_ALL_ORDERS; import static com.sap.hana.cloud.samples.benefits.persistence.model.DBQueries.GET_USER_ORDERS_FOR_CAMPAIGN; import java.util.ArrayList; import java.util.List; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; @Entity @Table(name = "ORDERS") @NamedQueries({ @NamedQuery(name = GET_USER_ORDERS_FOR_CAMPAIGN, query = "select o from Order o where o.user = :user and o.campaign = :campaign"), @NamedQuery(name = GET_USER_ALL_ORDERS, query = "select o from Order o where o.user = :user") }) public class Order implements IDBEntity { @Id @GeneratedValue @Column(name = "ORDER_ID") private Long id; @Basic @Column private long total; @ManyToOne @JoinColumn(name = "CAMPAIGN_ID", referencedColumnName = "CAMPAIGN_ID") private Campaign campaign; @Column(name = "CAMPAIGN_ID", insertable = false, updatable = false) private Long campaignId; @ManyToOne @JoinColumn(name = "USER_ID", referencedColumnName = "ID") private User user; @Column(name = "USER_ID", insertable = false, updatable = false) private Long userId; @OneToMany(cascade = CascadeType.ALL, mappedBy = "order", fetch = FetchType.EAGER, targetEntity = OrderDetails.class) private List<OrderDetails> orderDetails; @Override public Long getId() { return id; } public void setId(Long id) { this.id = id; } public long getTotal() { return total; } public void setCampaign(Campaign campaign) { this.campaign = campaign; if (!campaign.getOrders().contains(this)) { campaign.getOrders().add(this); } } public Campaign getCampaign() { return campaign; } public User getUser() { return user; } public void setUser(User user) { this.user = user; if (!user.getOrders().contains(this)) { user.addOrder(this); } } public List<OrderDetails> getOrderDetails() { if (this.orderDetails == null) { this.orderDetails = new ArrayList<>(); } return orderDetails; } public void addOrderDetails(OrderDetails details) { getOrderDetails().add(details); this.total += details.getQuantity() * details.getBenefitType().getValue(); if (details.getOrder() != this) { details.setOrder(this); } } public void removeOrderDetails(OrderDetails details) { final long orderTotal = details.getQuantity() * details.getBenefitType().getValue(); if ((this.total - orderTotal) < 0) { throw new IllegalArgumentException("Order total value can not be less than zero"); //$NON-NLS-1$ } getOrderDetails().remove(details); this.total -= orderTotal; } public void setOrderDetails(List<OrderDetails> orderDetails) { this.orderDetails = orderDetails; } public Long getCampaignId() { return campaignId; } public void setCampaignId(Long campaignId) { this.campaignId = campaignId; } public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } }