0

これは宿題であり、理解できないので、助けていただければ幸いです。このシステムは、オリンピックのメダル集計シミュレータです。

Events テーブルと Country テーブルがあります。

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

この質問では、3 つの Country インスタンス変数を Event に追加して、金、銀、銅の勝者を表し、関係タイプを含めるように指示しています。私にとって、多対一であることは理にかなっています。しかし、これを実行しようとすると、結合が間違っているというエラーが表示されます。これは、1 つの書き込みのみを許可し、残りを読み取り専用として許可する必要があるためです。

そのため、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;
   }

おそらく誰かが私にいくつかのガイダンスを与えることができますか?

4

1 に答える 1

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

上記の行は、次のことを意味します。このエンティティ (イベント) と国エンティティの間に関連付けがあり、この関連付けは、テーブル EVENTS の列 "COUNTRID" によって具体化されます。

すでに問題があります。EVENTS テーブルに COUNTRYID 列がありません。

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

上記の行は、このエンティティ (イベント) と Country エンティティの間に 3 つの異なる関連付けがあり、これらすべての関連付けが同じ列 COUNTRYID によって具体化されることを意味します。これはもちろん不可能です。関連付けが 3 つある場合は、3 つの異なる列が必要です。

注釈があるかどうかに関係なく、常に 1 行に 1 つの宣言を行うことをお勧めします。3 つの関連付けを 3 行で宣言し、それぞれに適切な注釈を付けます。それぞれが ManyToOne です。そして、それらのそれぞれには、関連付けを具体化するための独自の列があります。もちろん、この列はテーブルに存在する必要があります。

于 2012-05-29T17:03:51.027 に答える