Насколько я понимаю, однонаправленное отношение «один ко многим» имеет таблицу соединения, а двунаправленное отношение «один ко многим» - нет.
Мое приложение работает, когда я реализовал однонаправленные отношения, но я не могу заставить его работать для двунаправленных отношений.
Это таблицы, которые я создаю
CREATE TABLE CUSTOMER (customerNo INTEGER PRIMARY KEY, joinDate DATE, customerName VARCHAR2(20));
CREATE TABLE BOOKING (bookingNo INTEGER PRIMARY KEY, bookedDate DATE, custNo INTEGER, itemNo NUMBER(10), itemName VARCHAR2(20), quantity NUMBER(5), bookingDate DATE, bookingValue NUMBER(8, 2), constraint booking_fk foreign key (custNo) references customer(customerNo));
Мой первый класс
public class Booking implementes Serializable{
private Timestamp bookeddate;
private Timestamp bookingdate;
@Id()
@GeneratedValue(generator"MY_SEQ_GEN")
@SequenceGenerator(name="MY_SEQ_GEN", sequenceName="MY_SEQUENCE", allocationSize=1)
@Column(name="bookingNo", nullable=false)
private Long bookingno;
private Double bookingvalue;
@Column(length = 20)
private String itemname;
private Long itemno;
private Long quantity;
private Customer customer;
@ManyToOne
public Customer getCustomer() {
return customer;
}
...
мой другой класс
public class Customer implements Serializable {
@Column(length = 20)
private String customername;
@Id()
@GeneratedValue(generator="THE_SEQ_GEN")
@SequenceGenerator(name="THE_SEQ_GEN", sequenceName="THE_SEQUENCE", allocationSize=1)
@Column(name="customerNo", nullable=false)
private Long customerno;
private Timestamp joindate;
@OneToMany(cascade=(CascadeType.ALL), fetch=FetchType.EAGER, mappedBy = "customer")
private List<Booking> bookings = new ArrayList<Booking>();
public List<Booking> getBookings() {
return bookings;
}
мой боб падает после запуска этого метода
public void addBooking(Long custno, Long tickno, Long quantity) {
Customer cust = (Customer) em.createNamedQuery("findCustomerByPrimaryKey").setParameter("eid", custno).getSingleResult();
Booking b = new Booking();
b.setBookeddate(new Timestamp(System.currentTimeMillis()));
b.setCustomer(cust);
b.setTicket((Ticket) em.createNamedQuery("findTicketByPrimaryKey").setParameter("eid", tickno).getSingleResult(), quantity);
cust.addBooking(b);
//persistBooking(b);
}
И это мое сообщение об ошибке.
javax.ejb.EJBException: BEA1-001D72BA69DC9E472B1E: Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-00904: "CUSTOMER_CUSTOMERNO": invalid identifier
Error Code: 904
Call: INSERT INTO BOOKING (bookingNo, ITEMNAME, BOOKINGDATE, BOOKINGVALUE, ITEMNO, QUANTITY, BOOKEDDATE, CUSTOMER_customerNo) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
bind => [71, Metallica, 2011-01-05 22:07:17.788, 200.0, 420, 2, 2011-01-05 22:07:17.788, 1526]
Query: InsertObjectQuery(courseworkone.Booking@201a41)
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:801)