Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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
Java 无法转换具有@IdClass的实体中的请求元素_Java_Spring_Hibernate_Spring Data - Fatal编程技术网

Java 无法转换具有@IdClass的实体中的请求元素

Java 无法转换具有@IdClass的实体中的请求元素,java,spring,hibernate,spring-data,Java,Spring,Hibernate,Spring Data,我有以下设置: @Entity @IdClass(MemberAttributePk.class) public class MemberAttribute { @Id @ManyToOne @JoinColumn(name="member_id") protected Member member; @Id protected String name; private String value; public MemberAttrib

我有以下设置:

@Entity
@IdClass(MemberAttributePk.class)
public class MemberAttribute {
    @Id
    @ManyToOne @JoinColumn(name="member_id")
    protected Member member;

    @Id
    protected String name;

    private String value;

    public MemberAttribute() {}

    // get & set
}
和id类:

public class MemberAttributePk implements Serializable {
    protected Member member;
    protected String name;

    public MemberAttributePk() {}

    // get & set
}
我已经为
MemberAttribute
定义了一个简单的Spring数据存储库:

@Repository
public interface MemberAttributeRepo extends JpaRepository<MemberAttribute, MemberAttributePk> {
}
但是,我最终遇到了以下服务器异常:

2016-08-28 00:24:20.673  WARN 5656 --- [nio-8080-exec-8] .w.s.m.s.DefaultHandlerExceptionResolver : 
Failed to convert request element: org.springframework.beans.ConversionNotSupportedException: 
Failed to convert property value of type [java.lang.Long] to required type [com.example.Member] for property 'member'; nested exception is java.lang.IllegalStateException: 
Cannot convert value of type [java.lang.Long] to required type [com.example.Member] for property 'member': 
no matching editors or conversion strategy found
知道我做错了什么吗?
谢谢

只是您的代码不符合JPA。问题的原因是您使用
成员
作为PK的一部分。 主键只能由以下Java类型的字段组成

  • 原语:布尔、字节、字符、整数、长、短
  • java.lang:布尔值、字节、字符、整数、长、短、字符串、枚举、字符串缓冲区
  • java.math:biginger java.sql:Date、Time、Timestamp
  • java.util:日期、货币、地区、时区、UUID
  • java.net:URI,URL
  • javax.jdo.spi:支持持久性

  • 这应该起作用:

    @Embeddable
    public class MemberAttributePk implements Serializable {
        @Column(name = "member_id")
        protected Long memberId;
        @Column(name = "name")
        protected String name;
    
        public MemberAttributePk() {}
    
        // get & set
    }
    
    @Entity
    public class MemberAttribute {
    
        @EmbeddedId
        protected MemberAttributePk memberAttributePk;
    
        @ManyToOne 
        @JoinColumn(name="member_id")
        protected Member member;
    
        private String value;
    
        public MemberAttribute() {}
    
        // get & set
    }
    
    或与
    @ClassId

    public class MemberAttributePk implements Serializable {
        protected Long memberId;
        protected String name;
    
        public MemberAttributePk() {}
    
        // get & set
    }
    
    @Entity
    @IdClass(MemberAttributePk.class)
    public class MemberAttribute {
        @Id
        @Column(name = "member_id")
        protected Long memberId;
    
        @Id
        @Column(name = "name")
        protected String name;
    
        @ManyToOne 
        @JoinColumn(name="member_id")
        protected Member member;
    
        private String value;
    
        public MemberAttribute() {}
    
        // get & set
    }
    

    您可以尝试使用MemberRepository保存它,因为我相信您的成员类和MemberAttribute类具有一对多关系引用,下面是示例

    成员类

    @Entity
    public class Member {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        public long id;
    
        @OneToMany(mappedBy = "Member", cascade = CascadeType.ALL)
         private Set<MemberAttribute> mMemberAttributes = new HashSet<>();
    
         public void setMemberAttributes(Set<MemberAttribute> mMemberAttributes){
            this.mMemberAttributes = mMemberAttributes;
         }
    
         public Set<MemberAttribute> getMemberAttributes(){
             return mMemberAttributes;
         }
    
         // other code
    }
    

    谢谢就这样。稍微提到一下,
    成员
    应该映射为:
    @ManyToOne@JoinColumn(name=“Member\u id”,insertable=false,updateable=false)
    @Entity
    public class Member {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        public long id;
    
        @OneToMany(mappedBy = "Member", cascade = CascadeType.ALL)
         private Set<MemberAttribute> mMemberAttributes = new HashSet<>();
    
         public void setMemberAttributes(Set<MemberAttribute> mMemberAttributes){
            this.mMemberAttributes = mMemberAttributes;
         }
    
         public Set<MemberAttribute> getMemberAttributes(){
             return mMemberAttributes;
         }
    
         // other code
    }
    
    public interface MemberRepository extends JpaRepository<Member, Long> {
    
    }
    
    public void saveAttribute(Member member, String name, String value) {
        MemberAttribute attr = new MemberAttribute(member, name, value);
        member.getMemberAttributes().add(attr);
        memberRepository.save(member);
    }