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)。这样可以正确更新我的对象。我仍然希望有人能解决我的问题。