Event.java

package org.myorg.jpatickets.bo;

import java.io.Serializable;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.*;

@SuppressWarnings("serial")
@Entity
@Table(name="JPATICKETS_EVENT")
@NamedQueries({
    @NamedQuery(name="JPATicketEvent.fetchEventTickets", 
        query="select e from Event e "
                + "join fetch e.tickets "
                + "where e.id=:eventId"),
    @NamedQuery(name="JPATicketEvent.fetchEventTicketsSeats", 
        query="select e from Event e "
                + "join fetch e.venue "
                + "join fetch e.tickets t "
                + "join fetch t.seat "
                + "where e.id=:eventId")
})
@NamedNativeQueries({
    @NamedNativeQuery(name="JPATicketEvent.fetchEventDTO",
            query="select event.EVENT_ID, event.EVENT_NAME, event.START_TIME, event.VENUE_ID, "
                    + "venue.NAME venueName, count(ticket.*) numTickets "
                    + "from JPATICKETS_EVENT event "
                    + "join JPATICKETS_VENUE venue on venue.VENUE_ID = event.VENUE_ID "
                    + "join JPATICKETS_TICKET ticket on ticket.EVENT_ID = event.EVENT_ID "
                    + "where event.EVENT_ID = :eventId "
                    + "group by event.EVENT_ID, event.EVENT_NAME, event.START_TIME, event.VENUE_ID, venue.NAME",
            resultSetMapping="JPATicketEvent.EventDTOMapping")
})
@SqlResultSetMappings({
    @SqlResultSetMapping(name="JPATicketEvent.EventDTOMapping",
            entities={
                @EntityResult(entityClass=Event.class)
                },
            columns={
                @ColumnResult(name="venueName", type=String.class),
                @ColumnResult(name="numTickets", type=Long.class)
                }
    )
})
public class Event /* implements Serializable */ {
    @Id @GeneratedValue
    @Column(name="EVENT_ID")
    private int id;
    
    @Column(name="EVENT_NAME", length=40, nullable=false)
    private String name;
    
    @ManyToOne(fetch=FetchType.LAZY, optional=false)
    @JoinColumn(name="VENUE_ID", nullable=false, updatable=false)
    private Venue venue;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="START_TIME")
    private Date startTime;
    
    @OneToMany(mappedBy="event", cascade={CascadeType.PERSIST, CascadeType.REMOVE})
    private List<Ticket> tickets;
    
    protected Event() { }
    public Event(Venue venue) { 
        this.venue=venue;
    }
    public Event(int id) { this.id=id; }

    public int getId() { return id; }
    public Venue getVenue() { return venue; }

    public String getName() { return name; }
    public void setName(String name) {
        this.name = name;
    }
    public Event withName(String name) {
        setName(name);
        return this;
    }
    
    public Date getStartTime() { return startTime; }
    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }
    public Event withStartTime(Date startTime) {
        setStartTime(startTime);
        return this;
    }

    public List<Ticket> getTickets() { return tickets; }
    public void setTickets(List<Ticket> tickets) {
        this.tickets = tickets;
    }
    public Event withTicket(Ticket ticket) {
        if (tickets==null) {
            tickets = new LinkedList<Ticket>();
        }
        if (ticket!=null) {
            tickets.add(ticket);
        }
        return this;
    }
    
    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Event [id=").append(id)
                .append(", name=").append(name)
                .append(", venue=").append(venue==null ? null : venue.getName())
                .append(", startTime=").append(startTime)
                .append("]");
        return builder.toString();
    }
}