Java JPA 2:@MapsId映射中的隐式列引用失败

Java JPA 2:@MapsId映射中的隐式列引用失败,java,hibernate,annotations,jpa-2.0,Java,Hibernate,Annotations,Jpa 2.0,我正在尝试使用多个映射属性。但是当我尝试运行代码时,代码将生成异常,这个示例基于ProJPA2,第10章的书。有以下代码: DeptID.java public class DeptId implements Serializable{ private static final long serialVersionUID = 5177373337405448966L; private int number; private String country; ...............

我正在尝试使用多个映射属性。但是当我尝试运行代码时,代码将生成异常,这个示例基于ProJPA2,第10章的书。有以下代码:

DeptID.java

public class DeptId implements Serializable{

private static final long serialVersionUID = 5177373337405448966L;
private int number;
private String country;
    .....................
public class ProjectId implements Serializable{

private static final long serialVersionUID = 4239980609226293562L;
private String name;
private DeptId deptId;
.....................
@Entity
@IdClass(DeptId.class)
public class Department implements Serializable {

private static final long serialVersionUID = 1L;
@Id
private int number;
@Id
private String country;
private String name;

@OneToMany(mappedBy="deptId")
List<Project> projects;
    ......................
@Entity
@IdClass(ProjectId.class)
public class Project implements Serializable {

private static final long serialVersionUID = 1L;
@Id
private String name;

@Id
@ManyToOne
@JoinColumn(name="dept_id")
private Department deptId;
    ........................
ProjectId.java

public class DeptId implements Serializable{

private static final long serialVersionUID = 5177373337405448966L;
private int number;
private String country;
    .....................
public class ProjectId implements Serializable{

private static final long serialVersionUID = 4239980609226293562L;
private String name;
private DeptId deptId;
.....................
@Entity
@IdClass(DeptId.class)
public class Department implements Serializable {

private static final long serialVersionUID = 1L;
@Id
private int number;
@Id
private String country;
private String name;

@OneToMany(mappedBy="deptId")
List<Project> projects;
    ......................
@Entity
@IdClass(ProjectId.class)
public class Project implements Serializable {

private static final long serialVersionUID = 1L;
@Id
private String name;

@Id
@ManyToOne
@JoinColumn(name="dept_id")
private Department deptId;
    ........................
Department.java

public class DeptId implements Serializable{

private static final long serialVersionUID = 5177373337405448966L;
private int number;
private String country;
    .....................
public class ProjectId implements Serializable{

private static final long serialVersionUID = 4239980609226293562L;
private String name;
private DeptId deptId;
.....................
@Entity
@IdClass(DeptId.class)
public class Department implements Serializable {

private static final long serialVersionUID = 1L;
@Id
private int number;
@Id
private String country;
private String name;

@OneToMany(mappedBy="deptId")
List<Project> projects;
    ......................
@Entity
@IdClass(ProjectId.class)
public class Project implements Serializable {

private static final long serialVersionUID = 1L;
@Id
private String name;

@Id
@ManyToOne
@JoinColumn(name="dept_id")
private Department deptId;
    ........................
此代码将生成以下异常

Caused by: org.hibernate.AnnotationException: Implicit column reference in the @MapsId mapping fails, try to use explicit referenceColumnNames: example.domain.Department

DeptID有两个主键,因此不能有类似于
@JoinColumn(name=“dept\u id”)
的东西。相反,请使用以下命令:

@JoinColumns({
    @JoinColumn(name="dept_number", referencedColumnName="number"),
    @JoinColumn(name="dept_country", referencedColumnName="country")
})
如果这仍然不起作用:在主键类(DeptID和projectd)中,尝试切换到public或protected私有属性。还要检查它们是否有一个没有参数的构造函数,并实现equals&hashcode方法