JPA,如何找到具有复合id的对象?
基于第二种方法,我设计了我的JPA类JPA,如何找到具有复合id的对象?,jpa,intellij-idea,find,datastore,Jpa,Intellij Idea,Find,Datastore,基于第二种方法,我设计了我的JPA类 @Entity(name = "SearchKeywordJPA") @IdClass(SearchKeywordJPA.SearchKeyId.class) public class SearchKeywordJPA implements Comparable<SearchKeywordJPA> { @Id private String keyword; @Id private long date; p
@Entity(name = "SearchKeywordJPA")
@IdClass(SearchKeywordJPA.SearchKeyId.class)
public class SearchKeywordJPA implements Comparable<SearchKeywordJPA> {
@Id
private String keyword;
@Id
private long date;
private String userUUID;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SearchKeywordJPA that = (SearchKeywordJPA) o;
if (date != that.date) return false;
if (!keyword.equals(that.keyword)) return false;
if (!userUUID.equals(that.userUUID)) return false;
return true;
}
@Override
public int hashCode() {
int result = keyword.hashCode();
result = 31 * result + (int) (date ^ (date >>> 32));
result = 31 * result + userUUID.hashCode();
return result;
}
@Override
public String toString() {
return "SearchKeywordJPA{" +
"keyword='" + keyword + '\'' +
", date=" + date +
", userUUID='" + userUUID + '\'' +
'}';
}
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
public long getDate() {
return date;
}
public void setDate(long date) {
this.date = date;
}
public String getUserUUID() {
return userUUID;
}
public void setUserUUID(String userUUID) {
this.userUUID = userUUID;
}
@Override
public int compareTo(SearchKeywordJPA searchRecord) {
long comparedDate = searchRecord.date;
if (this.date > comparedDate) {
return 1;
} else if (this.date == comparedDate) {
return 0;
} else {
return -1;
}
}
/**********************
* Key class
**********************/
public class SearchKeyId {
private int id;
private int version;
}
}
然而,当我运行时,应用程序崩溃,日志显示
javax.persistence.PersistenceException: org.datanucleus.store.appengine.FatalNucleusUserException: Received a request to find an object of type com.twitterjaya.model.SearchKeywordJPA identified by SearchKeywordJPA{keyword='airasia', date=1335680686149, userUUID='FFFF0000'}. This is not a valid representation of a primary key for an instance of com.twitterjaya.model.SearchKeywordJPA.
原因是什么?如有任何建议,将不胜感激。谢谢您将IdClass的一个实例传递给em.find。。。i、 e SearchKeyId。显然,如果你真的有一个IdClass,那么你可能会遇到很多问题。只有使用GAE/Datastore的古老插件,这些问题才会增加。如果您的密钥是
@Entity(name = "SearchKeywordJPA")
@IdClass(SearchKeywordJPA.SearchKeyId.class)
public class SearchKeywordJPA implements Comparable<SearchKeywordJPA> {
你的实体我假设是这样的
@Entity(name = "SearchKeywordJPA")
@IdClass(SearchKeyId.class)
public class SearchKeywordJPA {
@Id
private String keyword;
@Id
private long date;
private String userUUID;
-
仅考虑查找方法将使用SeaKyKig类查找
实体
- IdClass中的字段需要在实体中具有@Id注释
- 密钥本身不能是实体
- 实际上并不需要Compariable,因为所有比较都放在IdClass中
public class SearchKeyId implements Serializable {
private String keyword;
private long date;
@Entity(name = "SearchKeywordJPA")
@IdClass(SearchKeyId.class)
public class SearchKeywordJPA {
@Id
private String keyword;
@Id
private long date;
private String userUUID;