Purchase.java

package ejava.jpa.example.validation;

import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.*;
import static javax.persistence.CascadeType.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;

@Entity
@Table(name="VALIDATION_PURCHASE")
public class Purchase {
	@Id @GeneratedValue
	private int id;
	
	@Temporal(TemporalType.TIMESTAMP)
	@NotNull(message="purchase requires a date")
	@Past(message="future purchases not allowed")
	private Date date;
	
	@OneToMany(fetch=FetchType.LAZY, cascade={PERSIST, REMOVE, DETACH})
	@JoinColumn(name="PURCHASE_ID")
	@Valid
	private Set<PurchaseItem> items;

	public int getId() { return id; }

	public Date getDate() { return date; }
	public Purchase setDate(Date date) {
		this.date = date;
		return this;
	}

	public Set<PurchaseItem> getItems() {
		if (items==null) {
			items = new HashSet<PurchaseItem>();
		}
		return items; 
	}
	public Purchase setItems(Set<PurchaseItem> items) {
		this.items = items;
		return this;
	}
	public Purchase addItem(PurchaseItem item) {
		getItems().add(item);
		return this;
	}
	
	public BigDecimal getTotal() {
		BigDecimal total = new BigDecimal(0);
		for (PurchaseItem item : getItems()) {
			total.add(item.getTotal());
		}
		return total;
	}
	
	@Override
	public String toString() {
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		NumberFormat nf = NumberFormat.getCurrencyInstance();
		StringBuilder text = new StringBuilder();
		text.append("#" + id);
		text.append(date==null?null : df.format(date));
		text.append("\n");
		for (PurchaseItem item : getItems()) {
			text.append(item.toString()).append("\n");
		}
		text.append("total=").append(nf.format(getTotal()));
		
		return text.toString();
	}
	
}