【问题标题】:Netbeans @JoinColoumns error with auto generated entity classNetbeans @JoinColoumns 错误与自动生成的实体类
【发布时间】:2014-03-21 13:59:05
【问题描述】:

我使用 Netbeans 7.4 从数据源创建实体。

我有一个错误,所有具有复合主键的实体都会出现错误。错误如下所示。

我在 stack-overflow 上搜索过这个问题,通常是因为人们没有定义连接列。但我已经完成了。我也不确定 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; 

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 Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.ValidationException 异常描述:实体类 [class com.fyp.simstest.Absence] 中带注释的元素 [field timetable] 上的 @JoinColumns 不完整。 当源实体类使用复合主键时,必须使用@JoinColumns 为每个连接列指定@JoinColumn。 名称和引用的ColumnName 元素都必须在每个这样的@JoinColumn 中指定。 在 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;
    }

时间表PK

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

编辑两个

【问题讨论】:

  • @Brawn 当您在一个列上使用带有 false 和 @NotNull 的 @Basic 时,这是一个史诗般的失败。你可以这样做 @Column(name=" ",nullable = false)
  • 其实并没有失败。例如,@NotNull 可以由 bean validation 使用,而 nullable = false 不能。虽然您可以跳过Basic 并在Column 注释中将optional=false 转换为nullable=false

标签: java mysql sql jakarta-ee jpa


【解决方案1】:

您的图表表明TimeTable 表有一个由三列(PeriodDayClass_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;
    ...
}

【讨论】:

  • 感谢您的回复!我已经用我的时间表和 timetablePK 文件更新了我的问题,你在回答中说我需要向 Absence.timetable 添加注释,这是哪个实体? @vosburgh
  • 我不确定你的问题是什么......我描述的@JoinColumns 注释应该应用于Absense 类中的timeTable 字段。这有帮助吗?
【解决方案2】:

考虑一下:

@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 映射中使用的其他引用实体,这应该是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多