映射多对一外键Java EE

时间:2012-05-29 16:31:04

标签: java ejb many-to-one

这是作业,我不明白,所以感谢帮助。该系统是奥运奖牌计数模拟器。

我们有一个Events表和一个Countries表:

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实例变量来表示金牌,银牌和铜牌,并包括关系类型。对我来说,做多对一是有意义的。但是,当我尝试运行时,我得到一个关于连接错误的错误,因为它应该只允许一次写入,其余的只读。

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

也许有人可以给我一些指导?

1 个答案:

答案 0 :(得分: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。每个人都有自己的专栏来实现这种联系。当然,这个专栏必须存在于表格中。