2014-02-20 44 views
0

我使用Netbeans 7.4從數據源創建實體。自動生成的實體類的Netbeans @JoinColoumns錯誤

而且我有一個錯誤,它出現在具有複合主鍵的所有實體中。錯誤可以在下面看到。

我已經在堆棧溢出中搜索了這個問題,它通常是因爲人們還沒有定義連接列。但我已經完成了。我也不確定netbeans生成的代碼中存在錯誤。

這裏是我的MySQL數據庫的形象,我正向設計來創建這些實體來說:

任何幫助將不勝感激!

enter image description here

這裏是唯一的相關代碼

缺席實體:

public class Absence implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @EmbeddedId 
    protected AbsencePK absencePK; 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "idAbsence") 
    private int idAbsence; 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "Date") 
    @Temporal(TemporalType.DATE) 
    private Date date; 
    @Size(max = 35) 
    @Column(name = "type") 
    private String type; 
    @Lob 
    @Size(max = 65535) 
    @Column(name = "remark") 
    private String remark; 
    @JoinColumn(name = "TimeTable_Period", referencedColumnName = "Period", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Timetable timetable; 
    @JoinColumn(name = "Student_idStudent", referencedColumnName = "idStudent", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Student student; 
    @JoinColumn(name = "Class_idClass", referencedColumnName = "idClass", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Class class1; 

AbsencePK實體:

@Embeddable 
public class AbsencePK implements Serializable { 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "Class_idClass") 
    private int classidClass; 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "Student_idStudent") 
    private int studentidStudent; 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "TimeTable_Period") 
    private int timeTablePeriod; 

    public AbsencePK() { 
    } 

    public AbsencePK(int classidClass, int studentidStudent, int timeTablePeriod) { 
     this.classidClass = classidClass; 
     this.studentidStudent = studentidStudent; 
     this.timeTablePeriod = timeTablePeriod; 
    } 

錯誤:

所致:異常[的EclipseLink-7220](Eclipse持久服務 - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.ValidationException 異常描述:@JoinColumns上來自實體類[class com.fyp.simstest.Absence]的註釋元素[field timetable]不完整。 當源實體類使用複合主鍵時,必須使用@JoinColumns爲每個連接列指定@JoinColumn。 名稱和referencedColumnName元素都必須在每個這樣的@JoinColumn中指定。 在org.eclipse.persistence.exceptions.ValidationException.incompleteJoinColumnsSpecified(ValidationException.java:1847)

EDIT

時間表

@Entity 
@Table(name = "timetable") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "Timetable.findAll", query = "SELECT t FROM Timetable t"), 
    @NamedQuery(name = "Timetable.findByPeriod", query = "SELECT t FROM Timetable t WHERE t.timetablePK.period = :period"), 
    @NamedQuery(name = "Timetable.findByDay", query = "SELECT t FROM Timetable t WHERE t.timetablePK.day = :day"), 
    @NamedQuery(name = "Timetable.findByClassidClass", query = "SELECT t FROM Timetable t WHERE t.timetablePK.classidClass = :classidClass")}) 
public class Timetable implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @EmbeddedId 
    protected TimetablePK timetablePK; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "timetable") 
    private Collection<Absence> absenceCollection; 
    @JoinColumn(name = "Class_idClass", referencedColumnName = "idClass", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Class class1; 

    public Timetable() { 
    } 

    public Timetable(TimetablePK timetablePK) { 
     this.timetablePK = timetablePK; 
    } 

TimetablePK

Embeddable 
public class TimetablePK implements Serializable { 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "Period") 
    private int period; 
    @Basic(optional = false) 
    @NotNull 
    @Size(min = 1, max = 45) 
    @Column(name = "Day") 
    private String day; 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "Class_idClass") 
    private int classidClass; 

    public TimetablePK() { 
    } 

    public TimetablePK(int period, String day, int classidClass) { 
     this.period = period; 
     this.day = day; 
     this.classidClass = classidClass; 
    } 

編輯兩個

+0

@Brawn這是一個史詩般的失敗,當你在一列使用@ Basic和@NotNull @ Basic。你可以通過這樣做@Column(name =「」,nullable = false) – solvator

+1

實際上它不會失敗。例如@NotNull可以被'bean validation'使用,而'nullable = false'則不能。儘管您可以跳過'Basic'並在'Column'註釋中將'optional = false'轉換爲'nullable = false' –

回答

1

您的圖表示TimeTable表具有三列(PeriodDay,和Class_idClass)組成的主鍵。您將需要一個註釋到Absence.timeTable看起來是這樣的:

public class Absence implements Serializable { 
    ... 
    @JoinColumns[ 
     @JoinColumn(name = "TimeTable_Period", referencedColumnName = "Period", ...), 
     @JoinColumn(name = "????", referencedColumnName = "Day", ...), 
     @JoinColumn(name = "Class_idClass", referencedColumnName = "Class_idClass", ...) 
    ] 
    @ManyToOne(optional = false) 
    private TimeTable timeTable; 
    ... 
} 
+0

感謝您的迴應!我已經用我的時間表和時間表的PK文件更新了我的問題,您在答覆中說過,我需要向Absence.timetable添加註釋,該實體是哪個實體? @vosburgh – Bawn

+0

我不確定你的問題是什麼....我描述的'@ JoinColumns'註釋應該應用於'Absense'類中的'timeTable'字段。這有幫助嗎? –

+0

我編輯了我的答案,可能使其更清晰。 –

0

考慮一下:

@JoinColumn(name = "TimeTable_Period", referencedColumnName = "Period") 
private Timetable timetable; 

你已經在你的Timetable實體引用的列Period。但是在Timetable.java中,我看不到任何與您的表的Period列映射的字段。

例如:

@Id // as its the primary key! 
@Column(name="Period") 
private Long period 

這應該是相同的其他引用的實體那些您與@ManyToOne映射中使用。