package de.dhbw.humbuch.model.entity; import java.io.Serializable; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Map; 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.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.MapKeyColumn; import javax.persistence.MapKeyEnumerated; import javax.persistence.Table; /** * @author David Vitt * */ @Entity @Table(name="dunning") public class Dunning implements de.dhbw.humbuch.model.entity.Entity, Serializable { private static final long serialVersionUID = -6187908554803908912L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @ManyToOne(fetch=FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn(name="studentId", referencedColumnName="id") private Student student; @Enumerated(EnumType.STRING) @Column(name="type") private Type type = Type.TYPE1; @Enumerated(EnumType.STRING) @Column(name="status") private Status status; @ManyToMany(fetch = FetchType.LAZY) @JoinTable( name="dunning_has_borrowedMaterial", joinColumns={@JoinColumn(name="dunningId", referencedColumnName="id")}, inverseJoinColumns={@JoinColumn(name="borrowedMaterialId", referencedColumnName="id"), @JoinColumn(name="borrowedMaterial_studentId", referencedColumnName="studentId")} ) private Set<BorrowedMaterial> borrowedMaterials = new HashSet<BorrowedMaterial>(); @ElementCollection @MapKeyEnumerated(EnumType.STRING) @MapKeyColumn(name="status") @CollectionTable(name="dunningDate", joinColumns = @JoinColumn(name="dunningId")) @Column(name="statusDate") private Map<Status, Date> statusDateMapping = new HashMap<Status, Date>(); /** * Required by Hibernate.<p> * Use the {@link Builder} instead. * * @see Builder */ @Deprecated public Dunning() {} public Date getStatusDate(Status status) { return statusDateMapping.get(status); } public Status getStatus() { return status; } public void setStatus(Status status) { if(this.status != status) { this.status = status; statusDateMapping.put(status, new Date()); } } public Set<BorrowedMaterial> getBorrowedMaterials() { return borrowedMaterials; } public void setBorrowedMaterials(Set<BorrowedMaterial> borrowedMaterials) { this.borrowedMaterials = borrowedMaterials; } public boolean addBorrowedMaterials(BorrowedMaterial borrowedMaterial) { return borrowedMaterials.add(borrowedMaterial); } public int getId() { return id; } public Student getStudent() { return student; } public Type getType() { return type; } public static class Builder { private int id; private Student student; private Type type; private Status status; private Set<BorrowedMaterial> borrowedMaterials; public Builder(Student student) { this.student = student; } public Builder type(Type type) { this.type = type; return this; } public Builder status(Status status) { this.status = status; return this; } public Builder borrowedMaterials(Set<BorrowedMaterial> borrowedMaterials) { this.borrowedMaterials = borrowedMaterials; return this; } public Builder id(int id) { this.id = id; return this; } public Dunning build() { return new Dunning(this); } } private Dunning(Builder builder) { id = builder.id; student = builder.student; type = builder.type; setStatus(Status.OPENED); status = builder.status; borrowedMaterials = builder.borrowedMaterials; } @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 Dunning)) return false; Dunning other = (Dunning) obj; if (getId() != other.getId()) return false; return true; } public enum Status { OPENED("Offen"), SENT("Versendet"), CLOSED("Erledigt"); private String value; private Status(String value) { this.value = value; } @Override public String toString() { return value; } } public enum Type { TYPE1("1. Mahnung"), TYPE2("2. Mahnung"); private String value; private Type(String value) { this.value = value; } @Override public String toString() { return value; } } }