这是作业,我不明白,所以感谢帮助。该系统是奥运奖牌计数模拟器。
我们有一个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;
}
也许有人可以给我一些指导?
答案 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。每个人都有自己的专栏来实现这种联系。当然,这个专栏必须存在于表格中。