![](/img/trans.png)
[英]AnnotationException: A Foreign key refering has the wrong number of column. should be 0
[英]AnnotationException: A Foreign key refering dayHibernate … wrong number of column. should be 3
我只想從兩個表中從標准員工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
}
第二實體
@Entity
@Table(name = "employees")
public class Employee {
@Id
@Column(name = "emp_no")
private long empNo;
@ManyToOne(optional = false)
@JoinColumn(name = "emp_no", insertable = false, updatable = false)
private Title title;
// setter, getter, constructor, other coluns
}
EmployeeDao是:
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
如何從這兩個表中獲取數據並避免異常? 幫我pl
在所引用實體上使用復合鍵時,不能將@JoinColumn與@ManyToOne一起使用。 異常確實說明了一切,Employee試圖僅使用emp_no來引用Title,但復合鍵中還有兩個字段。
我認為這是整個實體模型的設計問題。 由於TitleId包含Employee的主鍵,因此Title實體應該不能與Employee建立多對一關系,但是Employee應該可以擁有許多標題。
由於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<>();
... }
TitleId
@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;
}
將@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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.