package com.sap.hana.cloud.samples.benefits.persistence.model;
import static com.sap.hana.cloud.samples.benefits.persistence.model.DBQueries.GET_USER_BY_EMAIL;
import static com.sap.hana.cloud.samples.benefits.persistence.model.DBQueries.GET_USER_BY_USER_ID;
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;
import javax.persistence.UniqueConstraint;
@Entity
@Table(name = "USERS", uniqueConstraints = { @UniqueConstraint(columnNames = { "USER_ID" }) })
@NamedQueries({ @NamedQuery(name = GET_USER_BY_USER_ID, query = "select u from User u where u.userId = :userId"),
@NamedQuery(name = GET_USER_BY_EMAIL, query = "select u from User u where u.email = :email") })
public class User implements IDBEntity {
@Id
@GeneratedValue
@Column(name = "ID")
private Long id;
@Basic
@Column(name = "FIRST_NAME")
private String firstName;
@Basic
@Column(name = "LAST_NAME")
private String lastName;
@Basic
@Column(name = "USER_ID")
private String userId;
@Basic
private String email;
@ManyToOne
@JoinColumn(name = "HR_USER_ID", referencedColumnName = "ID")
private User hrManager;
@Column(name = "HR_USER_ID", insertable = false, updatable = false)
private Long hrId;
@OneToMany(mappedBy = "hrManager", fetch = FetchType.EAGER, targetEntity = User.class)
private List<User> employees;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.EAGER, targetEntity = Order.class)
private List<Order> orders;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.EAGER, targetEntity = UserPoints.class)
private List<UserPoints> userPoints;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner", fetch = FetchType.EAGER, targetEntity = Campaign.class)
private List<Campaign> campaigns;
public User() {
}
public User(String userId) {
this.userId = userId;
}
@Override
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFullName() {
return firstName + lastName;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public List<Order> getOrders() {
if (orders == null) {
orders = new ArrayList<>();
}
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
public void addOrder(Order order) {
getOrders().add(order);
if (order.getUser() != this) {
order.setUser(this);
}
}
public List<UserPoints> getUserPoints() {
if (this.userPoints == null) {
this.userPoints = new ArrayList<>();
}
return userPoints;
}
public void setUserPoints(List<UserPoints> userPoints) {
this.userPoints = userPoints;
}
public void addUserPoints(UserPoints points) {
getUserPoints().add(points);
if (points.getUser() != this) {
points.setUser(this);
}
}
public User getHrManager() {
return hrManager;
}
public void setHrManager(User hrManager) {
this.hrManager = hrManager;
if (!hrManager.getEmployees().contains(this)) {
hrManager.addEmployee(this);
}
}
public List<User> getEmployees() {
if (this.employees == null) {
this.employees = new ArrayList<>();
}
return employees;
}
public void addEmployee(User employee) {
getEmployees().add(employee);
if (employee.getHrManager() != this) {
employee.setHrManager(this);
}
}
public void setEmployees(List<User> employees) {
this.employees = employees;
}
public List<Campaign> getCampaigns() {
if (this.campaigns == null) {
this.campaigns = new ArrayList<>();
}
return campaigns;
}
public void addCampaign(Campaign campaign) {
getCampaigns().add(campaign);
if (campaign.getOwner() != this) {
campaign.setOwner(this);
}
}
public void setCampaigns(List<Campaign> campaigns) {
this.campaigns = campaigns;
}
public Long getHrId() {
return hrId;
}
public void setHrId(Long hrId) {
this.hrId = hrId;
}
}