0

这是家庭作业,我不明白,因此感谢您的帮助。该系统是一个奥运奖牌统计模拟器。

我们有一个事件表和一个国家表:

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

问题是向 Event 添加三个 Country 实例变量来代表金、银和铜牌的获胜者,并包括关系类型。对我来说,多对一是有意义的。但是,当我尝试运行它时,我收到一个关于 join 错误的错误,因为它应该只允许一次写入,其余的为只读。

因此,我将 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;

上面一行的意思是:这个实体(Event)和Country实体之间有一个关联,这个关联是由表EVENTS中的“COUNTRID”列具体化的。

已经有一个问题:您在 EVENTS 表中没有任何 COUNTRYID 列。

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

上面一行的意思是:这个实体(Event)和Country实体之间存在三种不同的关联,所有这些关联都由同一列COUNTRYID具体化。这当然是不可能的。如果您有三个关联,则需要三个不同的列。

一个好的规则,不管你有没有注释,每行总是有一个声明。在三个单独的行中声明您的三个关联,并用正确的注释对它们中的每一个进行注释。他们每个人都是ManyToOne。他们每个人都有自己的专栏来实现关联。当然,该列必须存在于表中。

于 2012-05-29T17:03:51.027 回答