package shop.bestellverwaltung.domain; import static shop.util.Constants.KEINE_ID; import static javax.persistence.CascadeType.MERGE; import static javax.persistence.CascadeType.PERSIST; import java.lang.invoke.MethodHandles; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.NamedAttributeNode; import javax.persistence.NamedEntityGraph; import javax.persistence.NamedEntityGraphs; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.PostPersist; import javax.validation.Valid; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import org.hibernate.validator.constraints.NotEmpty; import org.jboss.logging.Logger; import shop.util.persistence.AbstractAuditable; @XmlRootElement @Entity @NamedQueries({ @NamedQuery(name = Lieferung.FIND_LIEFERUNGEN_BY_LIEFERNR, query = "SELECT l" + " FROM Lieferung l" + " WHERE l.liefernr LIKE :" + Lieferung.PARAM_LIEFERNR) }) @NamedEntityGraphs({ @NamedEntityGraph(name = Lieferung.GRAPH_BESTELLUNGEN, attributeNodes = @NamedAttributeNode("bestellungen")) }) public class Lieferung extends AbstractAuditable { private static final long serialVersionUID = 7560752199018702446L; private static final Logger LOGGER = Logger.getLogger(MethodHandles.lookup().lookupClass()); private static final int LIEFERNR_LENGTH = 12; private static final String PREFIX = "Lieferung."; public static final String FIND_LIEFERUNGEN_BY_LIEFERNR = PREFIX + "findLieferungenByLieferNr"; public static final String PARAM_LIEFERNR = "lieferNr"; public static final String GRAPH_BESTELLUNGEN = PREFIX + "bestellungen"; @Id @GeneratedValue @Basic(optional = false) private Long id = KEINE_ID; @NotNull(message = "{lieferung.liefernr.notNull}") @Size(max = LIEFERNR_LENGTH, message = "{lieferung.liefernr.max}") @Column(unique = true) private String liefernr; @Column(name = "transport_art", length = 3) @Convert(converter = TransportTypeConverter.class) private TransportType transportArt; @ManyToMany(mappedBy = "lieferungen", cascade = { PERSIST, MERGE }) @NotEmpty(message = "{lieferung.bestellungen.notEmpty}") @Valid @XmlTransient private Set<Bestellung> bestellungen; public Lieferung() { super(); } public Lieferung(String liefernr, TransportType transportArt) { super(); this.liefernr = liefernr; this.transportArt = transportArt; } @PostPersist private void postPersist() { LOGGER.debugf("Neue Lieferung mit ID=%d", id); } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getLiefernr() { return liefernr; } public void setLiefernr(String liefernr) { this.liefernr = liefernr; } public TransportType getTransportArt() { return transportArt; } public void setTransportArt(TransportType transportArt) { this.transportArt = transportArt; } public Set<Bestellung> getBestellungen() { return bestellungen == null ? null : Collections.unmodifiableSet(bestellungen); } public void setBestellungen(Set<Bestellung> bestellungen) { if (this.bestellungen == null) { this.bestellungen = bestellungen; return; } // Wiederverwendung der vorhandenen Collection this.bestellungen.clear(); if (bestellungen != null) { this.bestellungen.addAll(bestellungen); } } public void addBestellung(Bestellung bestellung) { if (bestellungen == null) { bestellungen = new HashSet<>(); } bestellungen.add(bestellung); } public List<Bestellung> getBestellungenAsList() { return bestellungen == null ? null : new ArrayList<>(bestellungen); } public void setBestellungenAsList(List<Bestellung> bestellungen) { this.bestellungen = bestellungen == null ? null : new HashSet<>(bestellungen); } @Override public String toString() { return "Lieferung [id=" + id + ", liefernr=" + liefernr + ", transportArt=" + transportArt + ", " + super.toString() + ']'; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((liefernr == null) ? 0 : liefernr.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Lieferung other = (Lieferung) obj; if (liefernr == null) { if (other.liefernr != null) { return false; } } else if (!liefernr.equals(other.liefernr)) { return false; } return true; } }