Sale.java

package ejava.jpa.examples.query;

import java.math.BigDecimal;

import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import javax.persistence.*;

@Entity
@Table(name="JPAQL_SALE")
public class Sale {
    @Id @GeneratedValue 
    @Column(name="SALE_ID")
    private long id;

    @Temporal(TemporalType.TIMESTAMP)
    private Date date;

    @Column(precision=5, scale=2)
    private BigDecimal amount = new BigDecimal(0);
    
    /** This property has been purposely modeled as an ID and not a
     * relationship to show how JPA queries can still functionally associate
     * information without an explicit foreign key
     */
    @Column(name="BUYER_ID", nullable=false)
    private long buyerId;

    @ManyToOne(optional=false)
    @JoinColumn(name="SALE_STORE")
    private Store store;

    @ManyToMany
    @JoinTable(name="JPAQL_SALE_CLERK_LINK",
        joinColumns={@JoinColumn(name="SALE_ID")},
        inverseJoinColumns={@JoinColumn(name="CLERK_ID")}
        )
    private List<Clerk> clerks = new ArrayList<Clerk>();
    
    public long getId() { return id; }
    
    public List<Clerk> getClerks() { return clerks; }
    public Sale setClerks(List<Clerk> clerks) {
        this.clerks = clerks;
        return this;
    }
    public Sale addClerk(Clerk...clerk) {
    	if (clerk!=null) {
    		for (Clerk c : clerk) {
    			if (c != null) { clerks.add(c); }
    		}
    	}
    	return this;
    }
    
    public Store getStore() { return store; }
    public Sale setStore(Store store) {
        this.store = store;
        return this;
    }    

    public BigDecimal getAmount() { return amount; }
    public Sale setAmount(BigDecimal amount) {
        this.amount = amount;
        return this;
    }
    
    public long getBuyerId() { return buyerId; }
    public Sale setBuyerId(long buyerId) {
        this.buyerId = buyerId;
        return this;
    }
    
    public Date getDate() { return date; }
    public Sale setDate(Date date) {
        this.date = date;
        return this;
    }
    
    public String toString() {
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.US);
        StringBuilder text = new StringBuilder();
        text.append("date=" + (date==null ? null : df.format(date)));
        text.append(", amount=" + nf.format(amount));
        text.append(", buyer=" + buyerId);
        text.append(", clerks(" + clerks.size() + ")={");
        for(Clerk c : clerks) {
            text.append(c.getId() + ", ");
        }            
        text.append("}");
        return text.toString();
    }
}