Невозможно создать идентификацию объекта для класса "...", так как ключ имеет неподдерживаемый тип - PullRequest
0 голосов
/ 23 марта 2012

Я использую реализацию DataNucleus JDO в локальной базе данных H2. Я хочу проверить, существует ли экземпляр объекта в базе данных, зная его ключ.

Объект определен следующим образом:

@PersistenceCapable(objectIdClass=RawItemKey.class)
@Index(name="CONTAIN_IDX", members={"prefix", "language", "value"})
public class RawContainItem {

    @PrimaryKey
    @Column(length=40)
    String prefix = "";

    @PrimaryKey
    @Column(length=2)
    String language = "";

    @PrimaryKey
    @Column(length=Integer.MAX_VALUE)
    String value = "";    

    public RawContainItem(String prefix, String language, String value) {

        this.prefix = prefix;
        this.language = language;
        this.value = value;

    }

}

Ключевой класс:

public class RawItemKey implements Serializable {

    public String prefix = "";
    public String language = "";
    public String value = "";

    public static final char SEPARATOR = '\u2407';

    public RawItemKey() {

    }

    public RawItemKey(String retr) {

        int beg = retr.indexOf(SEPARATOR);
        int end = retr.lastIndexOf(SEPARATOR);

        if ( beg >= 0 ) {
            this.prefix = retr.substring(0, beg);
        }

        if ( end > 0 ) {
            this.value = retr.substring(end+1, retr.length());
        }

        if ( ( beg >= 0 ) && ( end > 0 ) ) {
            this.language = retr.substring(beg+1, end);
        }

    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 89 * hash + (this.prefix != null ? this.prefix.hashCode() : 0);
        hash = 89 * hash + (this.language != null ? this.language.hashCode() : 0);
        hash = 89 * hash + (this.value != null ? this.value.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {

        if (obj == this) { return true; }
        if (obj == null) { return false; }

        if (getClass() != obj.getClass()) {
            return false;
        }

        final RawItemKey other = (RawItemKey) obj;

        if ((this.prefix == null) ? (other.prefix != null) : !this.prefix.equals(other.prefix)) {
            return false;
        }

        if ((this.language == null) ? (other.language != null) : !this.language.equals(other.language)) {
            return false;
        }

        if ((this.value == null) ? (other.value != null) : !this.value.equals(other.value)) {
            return false;
        }

        return true;

    }

    @Override
    public String toString () {

        return this.prefix + SEPARATOR + this.language + SEPARATOR + this.value;

    }    

}

Код, который я использую:

RawItemKey tmp = new RawItemKey();
tmp.prefix = d.prefix;
tmp.language = "EN";
tmp.value = retr;
RawContainItem rretr = PM.getObjectById(RawContainItem.class, tmp);
if ( rretr == null ) {
    PM.makePersistent(new RawContainItem(d.prefix, "EN", retr));
}                                     

Я получаю ошибку:

org.datanucleus.exceptions.NucleusUserException:
 Unable to create Object Identity for class "net.dwst.findword.DataNucleus.RawBeginItem"
 since key is of an unsupported type (net.dwst.findword.DataNucleus.RawItemKey)
    at org.datanucleus.ObjectManagerImpl.newObjectId(ObjectManagerImpl.java:3362)
    at org.datanucleus.api.jdo.JDOPersistenceManager.newObjectIdInstance(JDOPersistenceManager.java:1627)
    at org.datanucleus.api.jdo.JDOPersistenceManager.getObjectById(JDOPersistenceManager.java:1749)
    at net.dwst.findword.EN.FeedDatabaseEN1.feed(FeedDatabaseEN1.java:92)
    at net.dwst.findword.EN.FeedDatabaseEN1.main(FeedDatabaseEN1.java:32)

Что вызывает эту ошибку и как проверить, существует ли объект в базе данных?

1 Ответ

2 голосов
/ 23 марта 2012

И использует ли RawContainItem идентификатор одного поля?Нету.Подсказка: прочитайте javadocs методов, так как они сообщают вам, когда их можно использовать.Если у вас есть «RawItemKey», то у вас есть «id», поэтому просто используйте pm.getObjectById(id)

...