Java 自动生成实体类的Netbeans@JoinColumns错误

Java 自动生成实体类的Netbeans@JoinColumns错误,java,mysql,sql,jakarta-ee,jpa,Java,Mysql,Sql,Jakarta Ee,Jpa,我已经使用Netbeans 7.4从数据源创建了实体 我有一个错误,所有实体都有一个复合主键。下面可以看到错误 我在堆栈溢出上搜索过这个问题,它通常是因为人们没有定义连接列。但我已经做到了。我也不确定netbeans生成的代码中怎么会有错误 这是我的MySQL数据库的一个图像,我将其向前设计以创建以下实体: 任何帮助都将不胜感激 这里是唯一的相关代码 缺勤实体: public class Absence implements Serializable { private static

我已经使用Netbeans 7.4从数据源创建了实体

我有一个错误,所有实体都有一个复合主键。下面可以看到错误

我在堆栈溢出上搜索过这个问题,它通常是因为人们没有定义连接列。但我已经做到了。我也不确定netbeans生成的代码中怎么会有错误

这是我的MySQL数据库的一个图像,我将其向前设计以创建以下实体:

任何帮助都将不胜感激

这里是唯一的相关代码

缺勤实体:

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; 
缺席主键实体:

@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;
    }
错误:

@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 异常描述:实体类[class com.fyp.simstest.Existence]中注释元素[field Timeline]上的@JoinColumns不完整。 当源实体类使用复合主键时,必须使用@JoinColumns为每个联接列指定@JoinColumn。 必须在每个这样的@JoinColumn中指定name和referencedColumnName元素。 位于org.eclipse.persistence.exceptions.ValidationException.incompleteJoinColumnsSpecified(ValidationException.java:1847)

编辑

时间表

@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;
    }

编辑两个

您的图表表明
时间表
表有一个由三列组成的主键(
期间
日期
,以及
类。您需要在
缺勤.时间表
中添加如下注释:

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; 
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;
    ...
}
考虑这一点:

@JoinColumn(name = "TimeTable_Period", referencedColumnName = "Period")
private Timetable timetable;
您已经在
时间表
实体中引用了
期间
列。但是在
timeline.java
中,我没有看到任何字段与表的
Period
列映射

例如:

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

这对于您在
@ManyToOne
映射中使用的其他引用实体应该是相同的。

@Brawn在一列上使用@Basic with false和@NotNull时,这是一个史诗般的失败。您可以这样做@Column(name=”“,nullable=false),实际上它并没有失败@例如,
bean验证
可以使用NotNull,而
nullable=false不能使用。A尽管您可以跳过
基本
并将
注释中的
可选=false
转换为
nullable=false
,谢谢您的回复!我已经用我的时间表和时间表PK文件更新了我的问题,你在回答中说我需要为缺勤添加注释。时间表这是哪个实体@我不知道你的问题是什么。。。。我描述的
@JoinColumns
注释应应用于
缺席
类中的
时间表
字段。这有用吗?