Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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 JPA/Hibernate-ManyToMany,在联接表中有附加列-“;没有持久的id属性“;IdClass_Java_Hibernate_Jpa_Orm - Fatal编程技术网

Java JPA/Hibernate-ManyToMany,在联接表中有附加列-“;没有持久的id属性“;IdClass

Java JPA/Hibernate-ManyToMany,在联接表中有附加列-“;没有持久的id属性“;IdClass,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,我正试图在JPA中建立一个多个关系,并在联接表中增加列 我遵循了下面的示例和测试代码: 如果我运行该代码,会出现以下异常: Caused by: org.hibernate.AnnotationException: package.ProjectAssociationId has no persistent id property at org.hibernate.cfg.AnnotationBinder.bindIdClass(AnnotationBinder.java:2507) at o

我正试图在JPA中建立一个多个关系,并在联接表中增加列

我遵循了下面的示例和测试代码:

如果我运行该代码,会出现以下异常:

Caused by: org.hibernate.AnnotationException: package.ProjectAssociationId has no persistent id property
at org.hibernate.cfg.AnnotationBinder.bindIdClass(AnnotationBinder.java:2507)
at org.hibernate.cfg.AnnotationBinder.mapAsIdClass(AnnotationBinder.java:845)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:671)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3466)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3420)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1348)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1747)
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:96)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:913)
... 51 more
原因:org.hibernate.AnnotationException:package.ProjectAssociationId没有持久id属性
位于org.hibernate.cfg.AnnotationBinder.bindIdClass(AnnotationBinder.java:2507)
位于org.hibernate.cfg.AnnotationBinder.mapAsIdClass(AnnotationBinder.java:845)
位于org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:671)
位于org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3466)
位于org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3420)
位于org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1348)
位于org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1747)
位于org.hibernate.ejb.EntityManagerFactoryImpl。(EntityManagerFactoryImpl.java:96)
位于org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:913)
... 还有51个
我试图向ProjectAssociationId添加不同的注释,但没有成功。ProjectAssociationId中是否需要任何类型的ID?我不这么认为,因为这实际上并没有持续下去。但是hibernate在抱怨什么呢

代码如下:

@Entity
public class Employee {
  @Id
  private long id;
  ...
  @OneToMany(mappedBy="employee")
  private List<ProjectAssociation> projects;
  ...
}
@Entity
public class Project {
  @Id
  private long id;
  ...
  @OneToMany(mappedBy="project")
  private List<ProjectAssociation> employees;
  ...
  // Add an employee to the project.
  // Create an association object for the relationship and set its data.
  public void addEmployee(Employee employee, boolean teamLead) {
    ProjectAssociation association = new ProjectAssociation();
    association.setEmployee(employee);
    association.setProject(this);
    association.setEmployeeId(employee.getId());
    association.setProjectId(this.getId());
    association.setIsTeamLead(teamLead);

    this.employees.add(association);
    // Also add the association object to the employee.
    employee.getProjects().add(association);
  }
}
@Entity
@Table(name="PROJ_EMP")
@IdClass(ProjectAssociationId.class)
public class ProjectAssociation {
  @Id
  private long employeeId;
  @Id
  private long projectId;
  @Column(name="IS_PROJECT_LEAD")
  private boolean isProjectLead;
  @ManyToOne
  @PrimaryKeyJoinColumn(name="EMPLOYEEID", referencedColumnName="ID")
  private Employee employee;
  @ManyToOne
  @PrimaryKeyJoinColumn(name="PROJECTID", referencedColumnName="ID")
  private Project project;
  ...
}
public class ProjectAssociationId implements Serializable {

  private long employeeId;

  private long projectId;
  ...

  public int hashCode() {
    return (int)(employeeId + projectId);
  }

  public boolean equals(Object object) {
    if (object instanceof ProjectAssociationId) {
      ProjectAssociationId otherId = (ProjectAssociationId) object;
      return (otherId.employeeId == this.employeeId) && (otherId.projectId == this.projectId);
    }
    return false;
  }

}
@实体
公营雇员{
@身份证
私人长id;
...
@OneToMany(mappedBy=“employee”)
私人清单项目;
...
}
@实体
公共类项目{
@身份证
私人长id;
...
@OneToMany(mappedBy=“项目”)
私人名单雇员;
...
//将员工添加到项目中。
//为关系创建关联对象并设置其数据。
public void addEmployee(员工-员工,布尔团队领导){
ProjectAssociation=新建ProjectAssociation();
协会。setEmployee(雇员);
协会。setProject(本项目);
association.setEmployeeId(employee.getId());
association.setProjectId(this.getId());
协会。setIsTeamLead(团队领导);
本.employees.add(协会);
//还要将关联对象添加到员工。
employee.getProjects().add(关联);
}
}
@实体
@表(name=“项目管理计划”)
@IdClass(ProjectAssociationId.class)
公共班级项目协会{
@身份证
私人长期雇员ID;
@身份证
私人长投射;
@列(name=“IS\u PROJECT\u LEAD”)
私人布尔型isProjectLead;
@许多酮
@PrimaryKeyJoinColumn(name=“EMPLOYEEID”,referencedColumnName=“ID”)
私人雇员;
@许多酮
@PrimaryKeyJoinColumn(name=“PROJECTID”,referencedColumnName=“ID”)
私人项目;
...
}
公共类ProjectAssociationId实现可序列化{
私人长期雇员ID;
私人长投射;
...
公共int hashCode(){
返回(int)(employeeId+projectId);
}
公共布尔等于(对象){
if(ProjectAssociationId的对象实例){
ProjectAssociationId otherId=(ProjectAssociationId)对象;
return(otherId.employeeId==this.employeeId)和&(otherId.projectId==this.projectId);
}
返回false;
}
}

你能发布构造和保存实体的代码吗?这篇文章可能会对你有所帮助