Java 自动生成实体类的Netbeans@JoinColumns错误
我已经使用Netbeans 7.4从数据源创建了实体 我有一个错误,所有实体都有一个复合主键。下面可以看到错误 我在堆栈溢出上搜索过这个问题,它通常是因为人们没有定义连接列。但我已经做到了。我也不确定netbeans生成的代码中怎么会有错误 这是我的MySQL数据库的一个图像,我将其向前设计以创建以下实体: 任何帮助都将不胜感激 这里是唯一的相关代码 缺勤实体: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
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
注释应应用于缺席
类中的时间表
字段。这有用吗?