Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AnnotationException:引用dayHibernate的外键。。。列数错误。应该是3_Java_Hibernate - Fatal编程技术网

Java AnnotationException:引用dayHibernate的外键。。。列数错误。应该是3

Java AnnotationException:引用dayHibernate的外键。。。列数错误。应该是3,java,hibernate,Java,Hibernate,我只想从两个表中从standard employees db MySQL获取数据: EMPLOYEES { EMP_NO, -- PK BIRTH_DATE, .... } TITLES { EMP_NO, -- PK, and FK to EMPLOYEES TITLE, -- PK FROM_DATE, -- PK TO_DATE, .... } 这是多个关键列: @Embeddable public class TitleId imple

我只想从两个表中从standard employees db MySQL获取数据:

EMPLOYEES {
   EMP_NO, -- PK
   BIRTH_DATE,
   ....
}

TITLES {
   EMP_NO, -- PK, and FK to EMPLOYEES
   TITLE, -- PK
   FROM_DATE, -- PK
   TO_DATE,
   ....
}
这是多个关键列:

@Embeddable
public class TitleId implements Serializable {
    @Column(name = "emp_no")
    private long empNumber;

    @Column(name = "title")
    private String title;

    @Column(name = "from_date")
    private java.sql.Date fromDate;

// constructor, hascode, setter, getter
// ................

}
还有一些实体:

第一实体

@Entity(name = "Title")
@Table(name = "titles")
public class Title implements Serializable {

    @EmbeddedId
    private TitleId titleId;

    @Column(name = "to_date")
    private java.sql.Date toDate;

    @OneToMany(mappedBy = "title")
    private List<Employee> employees = new ArrayList<>();

// constructor, setter, getter

}
而雇员DAO是:

    List employees = session.createQuery("FROM Employee").list();
    for (Iterator iterator = employees.iterator(); iterator.hasNext();){
        Employee employee = (Employee) iterator.next();
        System.out.print("First Name: " + employee.getFirstName());
        System.out.print("  Last Name: " + employee.getLastName());
    }
当我试图获取这些数据时,还有一个例外

AnnotationException: A Foreign key refering dayHibernate.Title from dayHibernate.Employee has the wrong number of column. should be 3

如何从这两个表中获取数据并避免异常?请帮助我

在引用的实体上使用复合键时,不能将@JoinColumn与@ManyToOne一起使用。例外情况说明了一切,Employee试图仅使用emp_no引用Title,但复合键中还有两个字段

我认为这是整个实体模型的设计问题。由于TitleId包含雇员的主键,因此头衔实体不应与雇员建立多对一关系,但雇员应具有多个头衔

由于Emp_no位于复合密钥中,并且是一个外键,因此您应该能够使用@MapsId

这对我很有用:

雇员

@Entity @Table(name = "employees") public class Employee {

    @Id
    @Column(name = "emp_no")
    private long empNo;

    @OneToMany(mappedBy="employee")
    private List<Title> titles = new ArrayList<>();

    ... }
头衔


将@JoinColumns添加到Employee表

@Entity
@Table(name = "employees")
public class Employee {

    @Id
    @Column(name = "emp_no")
    private long empNo;

    @ManyToOne(optional = false)
      @JoinColumns ({
      @JoinColumn(name="emp_number", referencedColumnName = "emp_no"),
      @JoinColumn(name="title", referencedColumnName = "title"),
      @JoinColumn(name="from_date", referencedColumnName = "from_date")
    })
    private Title title;

 //   setter, getter, constructor, other coluns
}

我尝试注释Employee类中的多个JoinColumn注释和Title字段,并对Title类中的列表使用OneToMany MapsIdempNumber注释,但存在:org.hibernate.AnnotationException:未知实体名称:java.util.List另一种方法我尝试在Employee类中使用MapsIdempNumber注释,而不是JoinColumn注释,但存在SQLSyntaxErrorException:未知列“字段列表”中的“employee0\u0.title\u emp\u no”,请再次查看,如果你有time@ordenvall但当我试图从employee中的标题中获取数据时,有一个java.sql.SQLSyntaxErrorException:未知列'field list'中的'titles0.\uEmployee.\u emp.\u no',我使用MySql测试数据库-感谢您的响应,但在'field list'@Vadimp'中有一个java.sql.sqlsyntaxerException:未知列'employee0..empNumber',我更新了答案,referencedColumnName应该是实际的column。
@Embeddable
public class TitleId implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "emp_no")
    private long empNumber;

    @Column(name = "title")
    private String title;

    @Column(name = "from_date")
    private java.sql.Date fromDate;
}
@Entity(name = "Title")
@Table(name = "titles")
public class Title implements Serializable {

    @EmbeddedId
    private TitleId titleId;

    @Column(name = "to_date")
    private java.sql.Date toDate;

    @MapsId("empNumber")
    @JoinColumn(name = "emp_no")
    @ManyToOne
    private Employee employee;

}
@Entity
@Table(name = "employees")
public class Employee {

    @Id
    @Column(name = "emp_no")
    private long empNo;

    @ManyToOne(optional = false)
      @JoinColumns ({
      @JoinColumn(name="emp_number", referencedColumnName = "emp_no"),
      @JoinColumn(name="title", referencedColumnName = "title"),
      @JoinColumn(name="from_date", referencedColumnName = "from_date")
    })
    private Title title;

 //   setter, getter, constructor, other coluns
}