Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA,如何找到具有复合id的对象?_Jpa_Intellij Idea_Find_Datastore - Fatal编程技术网

JPA,如何找到具有复合id的对象?

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

基于第二种方法,我设计了我的JPA类

@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中

IdClass的字段不需要注释。它是一个“id”,所以IdClass的所有字段都是id的一部分。是的,我的错,我只是复制了代码,忘记了,谢谢。
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;