Java JPA从主键更改为复合主键错误类必须使用一致的访问类型

Java JPA从主键更改为复合主键错误类必须使用一致的访问类型,java,hibernate,jpa,Java,Hibernate,Jpa,新的所有这一切,所以请让我知道,如果有任何遗漏或不正确的。 最初我创建了这个类,它只使用表的主键,如下所示: @Entity @Table(name="serviceRequestActivities" ,catalog="Maven_new" , uniqueConstraints = @UniqueConstraint(columnNames="serviceReqNr") ) public class ServiceRequestActivities implements java.

新的所有这一切,所以请让我知道,如果有任何遗漏或不正确的。 最初我创建了这个类,它只使用表的主键,如下所示:

@Entity
@Table(name="serviceRequestActivities"
,catalog="Maven_new"
, uniqueConstraints = @UniqueConstraint(columnNames="serviceReqNr") 
)

public class ServiceRequestActivities  implements java.io.Serializable,DbEntity {

private int activityNr;
private ServiceRequest serviceRequest;
...

@Id 
@Column(name="activityNr", unique=true, nullable=false)
public int getActivityNr() {
    return this.activityNr;
}

public void setActivityNr(int activityNr) {
    this.activityNr = activityNr;
}

@Override
@Transient
public Object getId(){
    return getActivityNr();
}

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="serviceReqNr", nullable=false)
public ServiceRequest getServiceRequest() {
    return this.serviceRequest;
}

public void setServiceRequest(ServiceRequest serviceRequest) {
    this.serviceRequest = serviceRequest;
}

... the other setters and getters

}
然后是需求中的一些更改,我必须使用复合主键来更新对象。我改了,现在看起来是这样的:

@Entity
@IdClass(MyKey.class)
@Table(name="serviceRequestActivities"
,catalog="Maven_new"
, uniqueConstraints = @UniqueConstraint(columnNames="serviceReqNr") 
)

public class ServiceRequestActivities  implements java.io.Serializable,DbEntity {

@Id private int activityNr;
@Id private ServiceRequest serviceRequest;
...

public class MyKey implements java.io.Serializable {
    @Column(name="activityNr", nullable=false)
    private int activityNr;
    private ServiceRequest serviceRequest;

    public int getActivityNr() {
        return this.activityNr;
    }

    public void setActivityNr(int activityNr) {
        this.activityNr = activityNr;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof ServiceRequestActivities)) return false;
        ServiceRequestActivities activity = (ServiceRequestActivities) o;
        return getId() != null && Objects.equals(getId(), activity.getId());
    }

    @Override
    public int hashCode() {
        return 31;
    }

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="serviceReqNr", nullable=false)
    public ServiceRequest getServiceRequest() {
        return this.serviceRequest;
    }

    public void setServiceRequest(ServiceRequest serviceRequest) {
        this.serviceRequest = serviceRequest;
    }
}
@Override
@Transient
public Object getId(){

    return getActivityNr();

}
...
the other setters and getters

}
还不能完全实现更改,因为有一个错误 “类必须使用一致的访问类型(字段或属性) 没有为此实体层次结构定义ID“
不确定什么不正确或缺少什么。

我找到了一个解决方案,尽管这个问题不是我想要的解决方案。我在表中创建了一个新的自动递增主键(activityKey),它将保存其他两个字段的唯一组合,这两个字段最初是复合键(activityNr和serviceRequestNr)。这样可以正确更新我的对象。我仍然希望有人能为我的问题找到解决方案。我找到了一个解决方案,尽管这不是我一直在寻找的解决方案。我在表中创建了一个新的自动递增主键(activityKey),它将保存其他两个字段的唯一组合,这两个字段最初是复合键(activityNr和serviceRequestNr)。这样可以正确更新我的对象。我仍然希望有人能解决我的问题。