2011-01-05 8 views
3

私の理解では、単方向の一対多の関係には結合表があり、双方向の一対多の関係はありません。Java EE - 1対多の双方向

私のアプリケーションは単方向関係を実装したときに動作しますが、双方向関係で動作するようには見えません。

これらは私が

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; 
    } 

私はこの方法

を実行した後、私のBeanが転倒を作成していたテーブルです
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; 
}