无法使用@IdClass转换实体中的请求元素

Ion*_*nut 8 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 MemberAttribute() {}

    // get & set
}
Run Code Online (Sandbox Code Playgroud)

和id类:

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

    public MemberAttributePk() {}

    // get & set
}
Run Code Online (Sandbox Code Playgroud)

我为以下内容定义了一个简单的Spring Data存储库MemberAttribute:

@Repository
public interface MemberAttributeRepo extends JpaRepository<MemberAttribute, MemberAttributePk> {
}
Run Code Online (Sandbox Code Playgroud)

现在,我想要做的就是将成员属性保存到数据库:

public void saveAttribute(Member member, String name, String value) {
    MemberAttribute attr = new MemberAttribute(member, name, value);
    attributeRepo.save(attr);
}
Run Code Online (Sandbox Code Playgroud)

但是,我最终得到了这个服务器异常:

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
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?谢谢!

Kon*_*bun 11

只是您的代码不符合JPA.问题的原因是你Member用作PK的一部分. PK只能由以下Java类型的字段组成

  1. 基元:布尔值,字节,字符,整数,长整数,短整数
  2. java.lang:Boolean,Byte,Character,Integer,Long,Short,String,Enum,StringBuffer
  3. java.math:BigInteger java.sql:Date,Time,Timestamp
  4. java.util:Date,Currency,Locale,TimeZone,UUID
  5. java.net:URI,URL
  6. javax.jdo.spi:PersistenceCapable

这应该工作:

@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
}
Run Code Online (Sandbox Code Playgroud)

或者与之相同 @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
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!而已。很少提及`Member`应该映射为:@ManyToOne @JoinColumn(name =“ member_id”,insertable = false,updatable = false)` (4认同)