1 package org.myorg.jpatickets.bo;
2
3 import java.io.Serializable;
4 import java.util.Date;
5 import java.util.LinkedList;
6 import java.util.List;
7
8 import javax.persistence.*;
9
10 @SuppressWarnings("serial")
11 @Entity
12 @Table(name="JPATICKETS_EVENT")
13 @NamedQueries({
14 @NamedQuery(name="JPATicketEvent.fetchEventTickets",
15 query="select e from Event e "
16 + "join fetch e.tickets "
17 + "where e.id=:eventId"),
18 @NamedQuery(name="JPATicketEvent.fetchEventTicketsSeats",
19 query="select e from Event e "
20 + "join fetch e.venue "
21 + "join fetch e.tickets t "
22 + "join fetch t.seat "
23 + "where e.id=:eventId")
24 })
25 @NamedNativeQueries({
26 @NamedNativeQuery(name="JPATicketEvent.fetchEventDTO",
27 query="select event.EVENT_ID, event.EVENT_NAME, event.START_TIME, event.VENUE_ID, "
28 + "venue.NAME venueName, count(ticket.*) numTickets "
29 + "from JPATICKETS_EVENT event "
30 + "join JPATICKETS_VENUE venue on venue.VENUE_ID = event.VENUE_ID "
31 + "join JPATICKETS_TICKET ticket on ticket.EVENT_ID = event.EVENT_ID "
32 + "where event.EVENT_ID = :eventId "
33 + "group by event.EVENT_ID, event.EVENT_NAME, event.START_TIME, event.VENUE_ID, venue.NAME",
34 resultSetMapping="JPATicketEvent.EventDTOMapping")
35 })
36 @SqlResultSetMappings({
37 @SqlResultSetMapping(name="JPATicketEvent.EventDTOMapping",
38 entities={
39 @EntityResult(entityClass=Event.class)
40 },
41 columns={
42 @ColumnResult(name="venueName", type=String.class),
43 @ColumnResult(name="numTickets", type=Long.class)
44 }
45 )
46 })
47 public class Event {
48 @Id @GeneratedValue
49 @Column(name="EVENT_ID")
50 private int id;
51
52 @Column(name="EVENT_NAME", length=40, nullable=false)
53 private String name;
54
55 @ManyToOne(fetch=FetchType.LAZY, optional=false)
56 @JoinColumn(name="VENUE_ID", nullable=false, updatable=false)
57 private Venue venue;
58
59 @Temporal(TemporalType.TIMESTAMP)
60 @Column(name="START_TIME")
61 private Date startTime;
62
63 @OneToMany(mappedBy="event", cascade={CascadeType.PERSIST, CascadeType.REMOVE})
64 private List<Ticket> tickets;
65
66 protected Event() { }
67 public Event(Venue venue) {
68 this.venue=venue;
69 }
70 public Event(int id) { this.id=id; }
71
72 public int getId() { return id; }
73 public Venue getVenue() { return venue; }
74
75 public String getName() { return name; }
76 public void setName(String name) {
77 this.name = name;
78 }
79 public Event withName(String name) {
80 setName(name);
81 return this;
82 }
83
84 public Date getStartTime() { return startTime; }
85 public void setStartTime(Date startTime) {
86 this.startTime = startTime;
87 }
88 public Event withStartTime(Date startTime) {
89 setStartTime(startTime);
90 return this;
91 }
92
93 public List<Ticket> getTickets() { return tickets; }
94 public void setTickets(List<Ticket> tickets) {
95 this.tickets = tickets;
96 }
97 public Event withTicket(Ticket ticket) {
98 if (tickets==null) {
99 tickets = new LinkedList<Ticket>();
100 }
101 if (ticket!=null) {
102 tickets.add(ticket);
103 }
104 return this;
105 }
106
107 @Override
108 public String toString() {
109 StringBuilder builder = new StringBuilder();
110 builder.append("Event [id=").append(id)
111 .append(", name=").append(name)
112 .append(", venue=").append(venue==null ? null : venue.getName())
113 .append(", startTime=").append(startTime)
114 .append("]");
115 return builder.toString();
116 }
117 }