package edu.ualberta.med.biobank.model; import java.util.HashSet; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; import org.hibernate.annotations.Type; import edu.ualberta.med.biobank.validator.constraint.Empty; import edu.ualberta.med.biobank.validator.constraint.Unique; import edu.ualberta.med.biobank.validator.group.PreDelete; import edu.ualberta.med.biobank.validator.group.PrePersist; @Entity @Table(name = "COLLECTION_EVENT", uniqueConstraints = { @UniqueConstraint(columnNames = { "PATIENT_ID", "VISIT_NUMBER" }) }) @Unique(properties = { "patient", "visitNumber" }, groups = PrePersist.class) @Empty(property = "allSpecimens", groups = PreDelete.class) public class CollectionEvent extends AbstractBiobankModel { private static final long serialVersionUID = 1L; private Integer visitNumber; private Set<Specimen> allSpecimens = new HashSet<Specimen>(0); private Patient patient; private ActivityStatus activityStatus = ActivityStatus.ACTIVE; private Set<EventAttr> eventAttrs = new HashSet<EventAttr>(0); private Set<Comment> comments = new HashSet<Comment>(0); private Set<Specimen> originalSpecimens = new HashSet<Specimen>(0); @Min(value = 1, message = "{edu.ualberta.med.biobank.model.CollectionEvent.visitNumber.Min}") @NotNull(message = "{edu.ualberta.med.biobank.model.CollectionEvent.visitNumber.NotNull}") @Column(name = "VISIT_NUMBER", nullable = false) public Integer getVisitNumber() { return this.visitNumber; } public void setVisitNumber(Integer visitNumber) { this.visitNumber = visitNumber; } @OneToMany(fetch = FetchType.LAZY, mappedBy = "collectionEvent") @Cascade({ CascadeType.SAVE_UPDATE }) public Set<Specimen> getAllSpecimens() { return this.allSpecimens; } public void setAllSpecimens(Set<Specimen> allSpecimens) { this.allSpecimens = allSpecimens; } @NotNull(message = "{edu.ualberta.med.biobank.model.CollectionEvent.patient.NotNull}") @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "PATIENT_ID", nullable = false) public Patient getPatient() { return this.patient; } public void setPatient(Patient patient) { this.patient = patient; } @NotNull(message = "{edu.ualberta.med.biobank.model.CollectionEvent.activityStatus.NotNull}") @Column(name = "ACTIVITY_STATUS_ID", nullable = false) @Type(type = "activityStatus") public ActivityStatus getActivityStatus() { return this.activityStatus; } public void setActivityStatus(ActivityStatus activityStatus) { this.activityStatus = activityStatus; } @OneToMany(cascade = javax.persistence.CascadeType.REMOVE, fetch = FetchType.LAZY, mappedBy = "collectionEvent") @Cascade({ CascadeType.SAVE_UPDATE }) public Set<EventAttr> getEventAttrs() { return this.eventAttrs; } public void setEventAttrs(Set<EventAttr> eventAttrs) { this.eventAttrs = eventAttrs; } @ManyToMany(cascade = javax.persistence.CascadeType.REMOVE, fetch = FetchType.LAZY) @JoinTable(name = "COLLECTION_EVENT_COMMENT", joinColumns = { @JoinColumn(name = "COLLECTION_EVENT_ID", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "COMMENT_ID", unique = true, nullable = false, updatable = false) }) public Set<Comment> getComments() { return this.comments; } public void setComments(Set<Comment> comments) { this.comments = comments; } @OneToMany(fetch = FetchType.LAZY, mappedBy = "originalCollectionEvent") public Set<Specimen> getOriginalSpecimens() { return this.originalSpecimens; } public void setOriginalSpecimens(Set<Specimen> originalSpecimens) { this.originalSpecimens = originalSpecimens; } }