I am just starting out with EJB:s and i ran into this problem. Can someone please help me out?
I have two tables: TOURNAMENT and EVENT. They have a one-to-many relation: a tournament can have zero, one or many events.
My tables are in an Oracle XE database:
CREATE TABLE TOURNAMENT
(
ID NUMBER NOT NULL,
NAME VARCHAR2(100 BYTE),
STATUS VARCHAR2(20 BYTE),
DESCRIPTION VARCHAR2(1000 BYTE),
START_DATE DATE,
END_DATE DATE,
START_BALANCE NUMBER(10,2),
MAX_PARTICIPANTS NUMBER,
UPDTS DATE
)
CREATE TABLE EVENT
(
ID NUMBER NOT NULL,
TOURNAMENT_ID NUMBER NOT NULL,
NAME VARCHAR2(100 BYTE),
START_DATE DATE,
END_DATE DATE,
STATUS VARCHAR2(20 BYTE),
UPDTS DATE
)
Now i created a session EJB for tournament:
package oracle;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
@Entity
@NamedQueries({
@NamedQuery(name = "Tournament.findAll", query = "select o from Tournament o"),
@NamedQuery(name = "Tournament.findByName", query = "select o from Tournament o where o.name = :P_name")
})
public class Tournament implements Serializable {
private String description;
@Column(name="END_DATE")
private Timestamp endDate;
@Id
@Column(nullable = false)
private Long id;
@Column(name="MAX_PARTICIPANTS")
private Long maxParticipants;
private String name;
@Column(name="START_BALANCE")
private Double startBalance;
@Column(name="START_DATE")
private Timestamp startDate;
private String status;
private Timestamp updts;
private List<Event> events = new ArrayList<Event>();
@OneToMany(cascade={CascadeType.ALL})
@JoinColumn(name="TOURNAMENT_ID")
public List<Event> getEvents() {
System.out.println("------------->inne i getEvents()");
return this.events;
}
public void setEvents(List<Event> inEvents) {
this.events = inEvents;
}
public Tournament() {
}
public Tournament(String description, Timestamp endDate, Long id,
Long maxParticipants, String name, Double startBalance,
Timestamp startDate, String status, Timestamp updts) {
this.description = description;
this.endDate = endDate;
this.id = id;
this.maxParticipants = maxParticipants;
this.name = name;
this.startBalance = startBalance;
this.startDate = startDate;
this.status = status;
this.updts = updts;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Timestamp getEndDate() {
return endDate;
}
public void setEndDate(Timestamp endDate) {
this.endDate = endDate;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getMaxParticipants() {
return maxParticipants;
}
public void setMaxParticipants(Long maxParticipants) {
this.maxParticipants = maxParticipants;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getStartBalance() {
return startBalance;
}
public void setStartBalance(Double startBalance) {
this.startBalance = startBalance;
}
public Timestamp getStartDate() {
return startDate;
}
public void setStartDate(Timestamp startDate) {
this.startDate = startDate;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Timestamp getUpdts() {
return updts;
}
public void setUpdts(Timestamp updts) {
this.updts = updts;
}
//Workaround for serialization error
private void writeObject(ObjectOutputStream out) throws IOException {
this.events.size();
out.defaultWriteObject();
}
}
*and one for event:*
package oracle;
import java.io.Serializable;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Entity
@NamedQueries({
@NamedQuery(name = "Event.findAll", query = "select o from Event o")
})
@Table(name = "EVENT")
public class Event implements Serializable {
private Timestamp endDate;
private Long id;
private String name;
private Timestamp startDate;
private String status;
private Long tournamentId;
private Timestamp updts;
public Event() {
}
public Event(Timestamp endDate, Long id, String name, Timestamp startDate,
String status, Long tournamentId, Timestamp updts) {
this.endDate = endDate;
this.id = id;
this.name = name;
this.startDate = startDate;
this.status = status;
this.tournamentId = tournamentId;
this.updts = updts;
}
@Id
@Column(name="ID", nullable = false)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name="END_DATE")
public Timestamp getEndDate() {
return endDate;
}
public void setEndDate(Timestamp endDate) {
this.endDate = endDate;
}
@Column(name="NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="START_DATE")
public Timestamp getStartDate() {
return startDate;
}
public void setStartDate(Timestamp startDate) {
this.startDate = startDate;
}
@Column(name="STATUS")
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@Column(name="TOURNAMENT_ID", nullable = false)
public Long getTournamentId() {
return tournamentId;
}
public void setTournamentId(Long tournamentId) {
this.tournamentId = tournamentId;
}
public Timestamp getUpdts() {
return updts;
}
public void setUpdts(Timestamp updts) {
this.updts = updts;
}
}
When trying to instantiate a tournament, i get an SQL error: ORA-00942: table or view does not exist
The SQL looks like this:
SELECT t1.ID, t1.NAME, t1.STATUS, t1.UPDTS, t1.START_DATE, t1.END_DATE, t1.TOURNAMENT_ID FROM TOURNAMENT_EVENT t0, EVENT t1 WHERE ((t0.Tournament_ID = ?) AND (t1.ID = t0.events_ID))
In other words, it is assumed a join table (TOURNAMENT_EVENT) is used, when i want to join the tables by pointing the EVENT.TOURNAMENT_ID to the TOURNAMENT.ID column.
How do i get around this without using a join table?