2011-01-05 65 views
3

我的理解是,一个单向一对多关系有一个连接表,而一个双向一对多关系没有。Java EE - 一对多双向

我的应用程序工作时,我实现了单向关系,但我似乎无法让它工作的双向关系。

这些都是我创造

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([email protected]) 
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:801) 

回答

2

您的客户映射使用默认列名是“CUSTOMER_CUSTOMERNO”,但已经使用“custNo”创建了表。您需要使用正确的列名称。

@ManyToOne 
@JoinColumn(name="custNo") 
public Customer getCustomer() { 
    return customer; 
}