我正在尝试使用http://www.datanucleus.org/products/accessplatform_4_0/jdo/orm/compound_identity.html上的示例作为指南为我的班级创建主键。我的主键包括3个字段,2个字符串和1个枚举。
根据http://www.datanucleus.org/products/accessplatform_4_0/jdo/types.html,枚举应该能够成为主键的一部分,但是当增强器运行时,我得到以下内容:
引起:org.datanucleus.metadata.InvalidPrimaryKeyException:类“A”已使用object-id类A $ PK指定,该类具有2个字段,而类已在主键中定义了3个字段。 objectidClass中的字段数和主键中的数字必须一致。
有人可以澄清BEnum enum(只是一个没有额外方法的标准枚举)是否可以用作主键中的字段?如果没有,建议的解决方法是什么?如果可以的话,我做错了什么?
该类定义为:
PersistenceCapable(detachable = "true", identityType = IdentityType.APPLICATION, objectIdClass = A.PK.class)
public final class A implements Serializable {
@PrimaryKey
private String field1;
@PrimaryKey
private BEnum field2;
@PrimaryKey
private String field3;
public static class PK implements Serializable {
private static final long serialVersionUID = 1L;
public String field1;
public BEnum field2;
public String field3;
public PK() {
}
public PK( String s ) {
StringTokenizer token = new StringTokenizer( s, ":" );
this.field1 = token.nextToken();
this.field2 = BEnum.valueOf( token.nextToken() );
this.field3 = token.nextToken();
}
@Override
public String toString() {
return field1 + ":" + field2 + ":" + field3;
}
@Override
public int hashCode() {
int hash = 7;
hash = 67 * hash + Objects.hashCode( this.field1 );
hash = 67 * hash + Objects.hashCode( this.field2 );
hash = 67 * hash + Objects.hashCode( this.field3 );
return hash;
}
@Override
public boolean equals( Object obj ) {
if( obj != null && (obj instanceof PK) ) {
PK that = (PK)obj;
return Objects.equals( this.field1, that.field2 ) && this.field2 == that.field2 && Objects.equals( this.field3, that.field3 );
}
return false;
}
@Persistent
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
}
枚举很简单:
public enum BEnum {
VALUE1, VALUE2, VALUE3, VALUE4
}