package edu.ualberta.med.biobank.model; import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.Transient; import javax.persistence.UniqueConstraint; import javax.validation.constraints.NotNull; import org.hibernate.annotations.ForeignKey; import edu.ualberta.med.biobank.validator.constraint.Unique; import edu.ualberta.med.biobank.validator.group.PrePersist; @Entity @Table(name = "CONTAINER_POSITION", uniqueConstraints = { @UniqueConstraint(columnNames = { "PARENT_CONTAINER_ID", "ROW", "COL" }) }) @Unique(properties = { "parentContainer", "row", "col" }, groups = PrePersist.class) public class ContainerPosition extends AbstractPosition { private static final long serialVersionUID = 1L; private Container parentContainer; private Container container; @NotNull(message = "{edu.ualberta.med.biobank.model.ContainerPosition.parentContainer.NotNull}") @ManyToOne @ForeignKey(name = "FK_ContainerPosition_parentContainer") @JoinColumn(name = "PARENT_CONTAINER_ID") public Container getParentContainer() { return parentContainer; } public void setParentContainer(Container parentContainer) { this.parentContainer = parentContainer; } /** * Read-only property (the corresponding setter does nothing) to get data * for a foreign key constraint to the parent container, ensuring that as * long as this {@link ContainerPosition} exists, the parent * {@link Container} has the same {@link ContainerType}. * * @return */ @ManyToOne @ForeignKey(name = "none") @JoinColumn(name = "PARENT_CONTAINER_TYPE_ID", nullable = false) ContainerType getParentContainerType() { return getParentContainer() != null ? getParentContainer().getContainerType() : null; } @SuppressWarnings("unused") void setParentContainerType(ContainerType parentContainerType) { } @NotNull(message = "{edu.ualberta.med.biobank.model.ContainerPosition.container.NotNull}") @OneToOne @ForeignKey(name = "none") @JoinColumn(name = "CONTAINER_ID") public Container getContainer() { return container; } public void setContainer(Container container) { this.container = container; } /** * Read-only property (the corresponding setter does nothing) to get data * for a foreign key constraint to the container, ensuring that as long as * this {@link ContainerPosition} exists, parent {@link Container} has the * same {@link ContainerType}. * * @return */ @ManyToOne @ForeignKey(name = "none") @JoinColumn(name = "CONTAINER_TYPE_ID", nullable = false) ContainerType getContainerType() { return getContainer() != null ? getContainer().getContainerType() : null; } @SuppressWarnings("unused") void setContainerType(ContainerType containerType) { } @Override @Transient public Container getHoldingContainer() { return getParentContainer(); } }