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类型的字段组成
这应该起作用:
@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);
}