带有枚举的DataNucleus JDO主键

时间:2014-08-21 14:38:58

标签: datanucleus

我正在尝试使用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
}

0 个答案:

没有答案