package de.dhbw.humbuch.model.entity; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.EnumSet; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; /** * @author David Vitt * */ @Entity @Table(name="student") public class Student implements de.dhbw.humbuch.model.entity.Entity, Serializable, Comparable<Student> { private static final long serialVersionUID = -3020872456290703528L; @Id private int id; @ManyToOne(fetch=FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn(name="gradeId", referencedColumnName="id") private Grade grade; private String lastname; private String firstname; private Date birthday; private String gender; private boolean leavingSchool; @OneToMany(mappedBy="student", fetch=FetchType.LAZY) private List<BorrowedMaterial> borrowedMaterials = new ArrayList<BorrowedMaterial>(); @ManyToMany(fetch = FetchType.LAZY) @JoinTable( name="borrowedMaterial", joinColumns={@JoinColumn(name="studentId", referencedColumnName="id")}, inverseJoinColumns={@JoinColumn(name="teachingMaterialId", referencedColumnName="id")}) private Collection<TeachingMaterial> teachingMaterials = new HashSet<>(); @ElementCollection(targetClass=Subject.class) @Enumerated(EnumType.STRING) @CollectionTable(name="studentSubject", joinColumns = @JoinColumn(name="studentId")) @Column(name="subject") private Set<Subject> profile = EnumSet.noneOf(Subject.class); @ManyToOne(fetch=FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn(name="parentId", referencedColumnName="id") private Parent parent; @OneToMany(mappedBy="student", fetch=FetchType.LAZY) private List<Dunning> dunnings = new ArrayList<Dunning>(); /** * Required by Hibernate.<p> * Use the {@link Builder} instead. * * @see Builder */ @Deprecated public Student() {} public int getId() { return id; } public void setId(int id) { this.id = id; } public Grade getGrade() { return grade; } public void setGrade(Grade grade) { this.grade = grade; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Parent getParent() { return parent; } public void setParent(Parent parent) { this.parent = parent; } public List<BorrowedMaterial> getBorrowedMaterials() { return borrowedMaterials; } public void setBorrowedMaterials(List<BorrowedMaterial> borrowedMaterials) { this.borrowedMaterials = borrowedMaterials; } public Collection<TeachingMaterial> getTeachingMaterials() { return teachingMaterials; } public Set<Subject> getProfile() { return profile; } public void setProfile(Set<Subject> profile) { this.profile = profile; } public void addSubject(Subject subject) { getProfile().add(subject); } public boolean hasSubject(Subject subject) { return getProfile().contains(subject); } public boolean isLeavingSchool() { return leavingSchool; } public void setLeavingSchool(boolean leavingSchool) { this.leavingSchool = leavingSchool; } public List<Dunning> getDunnings() { return dunnings; } public List<BorrowedMaterial> getUnreceivedBorrowedList() { List<BorrowedMaterial> unreceivedBorrowedMaterials = new ArrayList<BorrowedMaterial>(); for (BorrowedMaterial borrowedMaterial : getBorrowedMaterials()) { if(!borrowedMaterial.isReceived()) { unreceivedBorrowedMaterials.add(borrowedMaterial); } } return unreceivedBorrowedMaterials; } public List<BorrowedMaterial> getReceivedBorrowedMaterials() { List<BorrowedMaterial> receivedBorrowedMaterials = getBorrowedMaterials(); receivedBorrowedMaterials.removeAll(getUnreceivedBorrowedList()); return receivedBorrowedMaterials; } public List<BorrowedMaterial> getUnreturnedBorrowedMaterials() { List<BorrowedMaterial> unreturnedBorrowedMaterials = new ArrayList<BorrowedMaterial>(); for(BorrowedMaterial borrowedMaterial : getReceivedBorrowedMaterials()) { if(borrowedMaterial.getReturnDate() == null) { unreturnedBorrowedMaterials.add(borrowedMaterial); } } return unreturnedBorrowedMaterials; } public boolean hasUnreceivedBorrowedMaterials() { for(BorrowedMaterial borrowedMaterial : getBorrowedMaterials()) { if(!borrowedMaterial.isReceived()) { return true; } } return false; } public void copyDataFrom(Student student) { setBirthday(student.getBirthday()); setFirstname(student.getFirstname()); setGender(student.getGender()); setGrade(student.getGrade()); setLastname(student.getLastname()); setParent(student.getParent()); setProfile(student.getProfile()); } public static class Builder { private final int id; private final String firstname; private final String lastname; private final Date birthday; private final Grade grade; private String gender; private List<BorrowedMaterial> borrowedList = new ArrayList<BorrowedMaterial>(); private Set<Subject> profile = EnumSet.noneOf(Subject.class); private Parent parent; private boolean leavingSchool; public Builder(int id, String firstname, String lastname, Date birthday, Grade grade) { this.id = id; this.firstname = firstname; this.lastname = lastname; this.birthday = birthday; this.grade = grade; } public Builder gender(String gender) { this.gender = gender; return this; } public Builder borrowedList(List<BorrowedMaterial> borrowedList) { this.borrowedList = borrowedList; return this; } public Builder profile(Set<Subject> profile) { this.profile = profile; return this; } public Builder parent(Parent parent) { this.parent = parent; return this; } public Builder leavingSchool(boolean leavingSchool){ this.leavingSchool = leavingSchool; return this; } public Student build() { return new Student(this); } } private Student(Builder builder) { id = builder.id; firstname = builder.firstname; lastname = builder.lastname; birthday = builder.birthday; grade = builder.grade; leavingSchool = builder.leavingSchool; gender = builder.gender; borrowedMaterials = builder.borrowedList; profile = builder.profile; parent = builder.parent; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof Student)) return false; Student other = (Student) obj; if (getId() != other.getId()) return false; return true; } @Override public int compareTo(Student o) { int compareResult = getLastname().compareTo(o.getLastname()); if(compareResult != 0) { return compareResult; } compareResult = getFirstname().compareTo(o.getFirstname()); if(compareResult != 0) { return compareResult; } return Integer.compare(hashCode(), o.hashCode()); } }