繁体   English   中英

映射多对一外键Java EE

[英]Mapping many-to-one foreign key Java EE

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

我们有一个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;
   }

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

@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。 每个人都有自己的专栏来实现这种联系。 当然,该列必须存在于表中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM