2012-05-29 4 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; 

выше линии означает: Существует связь между этим объектом (Event) и лица Страна, и эта ассоциация материализуется в колонке «COUNTRID» в таблице событий.

Существует проблема: в таблице СОБЫТИЙ нет столбца COUNTRYID.

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

выше линия означает: есть три различные ассоциаций между этим объектом (Event) и лицами Страны, и все эти ассоциации материализуются тем же CountryId столбца. Это, конечно, невозможно. Если у вас три ассоциации, вам нужны три разных столбца.

Хорошее правило, есть ли у вас аннотации или нет, всегда иметь одно объявление в строке. Объявите свои три ассоциации в трех отдельных строках и аннотируйте каждый из них с помощью правильных аннотаций. Каждый из них - многопользовательский. И каждый из них имеет свою собственную колонку, чтобы материализовать ассоциацию. И, конечно, этот столбец должен существовать в таблице.

+0

эй, спасибо за ответ! – testpattern

+0

duh, было слишком медленно при редактировании ... Я думал, что JoinColumn объявляет, из какого столбца пришел внешний ключ, который является COUNTRYID. теперь я вижу, что они должны соответствовать таблице GOLD, SILVER и BRONZE из EVENT (я думаю). также, спасибо, указав отдельные строки, я не был уверен, что это имело какое-то значение! – testpattern

+0

мой представитель слишком низок, чтобы дать вам возможность проголосовать, но я постараюсь, когда он поднимется – testpattern