2012-05-29 110 views
0

這是作業,我不明白如此幫助表示讚賞。該系統是奧運獎牌理貨模擬器。映射多對一的外鍵Java EE

我們有一個活動表和國家表:

statement.execute("create table EVENTS (EVENTNUMBER integer primary key not null, EVENTNAME varchar(32), " + 
       " GENDER varchar(5), GOLD integer, SILVER integer, BRONZE integer)"); 

statement.execute("create table COUNTRIES (COUNTRYID integer primary key not null, NAME varchar(32)," + 
         "TOTALGOLD integer, TOTALSILVER integer, TOTALBRONZE integer)"); 

這些問題涉及到實體:

@Entity 
@Table(name = "COUNTRIES") 
public class Country implements Serializable 
{ 

    @Id 
    private int countryID; // This is the primary key 
    private String name; 
    private int totalGold; 
    private int totalSilver; 
    private int totalBronze; 
//getters, setters omitted 

@Entity 
@Table(name = "EVENTS") 
public class Event implements Serializable 
{ 

    @Id 
    private int eventNumber;  // This is the primary key 
    private String eventName; 
    private String gender;  // Men, Women or Mixed 
    @ManyToOne(optional=false) 
    @JoinColumn(name="COUNTRYID", nullable=false, updatable=false) 
    private Country gold, silver, bronze; 

//getter, setter methods omitted 

的問題說,三個國家的實例變量添加到事件代表金,銀和青銅贏家,幷包括關係類型。對我來說,這是一個多對一的理解。但是,當我嘗試運行這個時,我得到一個關於連接錯誤的錯誤,因爲它應該只允許一個寫,其餘的只讀。

因此,我將JoinColumn更改爲insertable = false並且出現錯誤:列'COUNTRYID'或者不在FROM列表中的任何表中,或者出現在聯接規範中並且超出聯接規範的範圍或出現在HAVING子句中,不在GROUP BY列表中。

這是我QueriesBean打這個方法:

public List<Event> getEvents() 
    { 
     List<Event> eventList = null; 

     Query query = em.createQuery("SELECT e FROM Event e"); 
     eventList = (List<Event>) query.getResultList(); 

     return eventList; 
    } 

也許有人可以給我一些指導?

回答

2
@JoinColumn(name="COUNTRYID", nullable=false, updatable=false) 
private Country gold; 

上面一行表示:有此實體(比賽)和國家實體之間的關聯,並且該關聯是通過在表中的事件列「COUNTRID」物化。

已經有一個問題:EVENTS表中沒有任何COUNTRYID列。

@JoinColumn(name="COUNTRYID", nullable=false, updatable=false) 
private Country gold, silver, bronze; 

上面一行表示:有此實體(比賽)和國家之間實體三個不同的關聯,並且所有這些關聯由同一列COUNTRYID物化。這當然是不可能的。如果你有三個關聯,你需要三個不同的列。

一個很好的規則,不管你有沒有註釋,總是每行有一個聲明。用三個獨立的行聲明你的三個關聯,並用正確的註釋爲每個關聯註釋。他們每個人都是一個ManyToOne。他們每個人都有自己的專欄來實現關聯。當然這個專欄必須存在於表格中。

+0

嘿,謝謝你的迴應! – testpattern

+0

呵呵,編輯速度太慢了......我以爲JoinColumn是聲明外鍵來自哪一列,這是COUNTRYID。現在我可以看到它們應該與EVENT表格的GOLD,SILVER和BRONZE相匹配(我認爲)。另外,謝謝你指出了單獨的行,我不知道這是否有所作爲! – testpattern

+0

我的代表太低,無法給你一票,但我會嘗試當它上升 – testpattern