Я использую реализацию 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)
Что вызывает эту ошибку и как проверить, существует ли объект в базе данных?