无法使用@IdClass转换实体中的请求元素 [英] Failed to convert request element in entity with @IdClass

查看:183
本文介绍了无法使用@IdClass转换实体中的请求元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



  @Entity 
@IdClass(MemberAttributePk.class)
public class MemberAttribute {
@Id
@ManyToOne @JoinColumn(name =member_id)
保护成员成员;

@Id
受保护的字符串名称;

私有字符串值;

public MemberAttribute(){}

// get&设置
}

和id类:

  public class MemberAttributePk implements Serializable {
protected member member;
保护字符串名称;

public MemberAttributePk(){}

// get& set
}

我为定义了一个简单的Spring Data存储库, MemberAttribute

  @Repository 
public interface MemberAttributeRepo extends JpaRepository< MemberAttribute,MemberAttributePk> {
}

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

  public void saveAttribute(Member member,String name,String value){
MemberAttribute attr = new MemberAttribute(member ,名称,价值);
attributeRepo.save(attr);
}

然而,我最终发现这个服务器异常:

  2016-08-28 00:24:20.673 WARN 5656 --- [nio-8080-exec-8] .wsmsDefaultHandlerExceptionResolver:
无法转换请求元素:org.springframework.beans.ConversionNotSupportedException:
无法将[java.lang.Long]类型的属性值转换为属性'member'所需的类型[com.example.Member];嵌套异常是java.lang.IllegalStateException:
无法将属性'member'的类型[java.lang.Long]的值转换为所需类型[com.example.Member]:
没有匹配的编辑器或转换战略发现

任何想法我做错了什么?
Thanks!

解决方案

简单地说你的代码不符合JPA。问题的原因是你使用 Member 作为PK的一部分。
PK只能由以下Java类型的字段组成



  1. 基元:布尔型,字节型,char型,int型,long型,short型
  2. java.lang 字符,整数,长,短,字符串,枚举,StringBuffer

  3. java.math :BigInteger java.sql:Date,Time,Timestamp

  4. java.util :日期,货币,区域设置,TimeZone,UUID URL

  5. javax.jdo.spi :PersistenceCapable







这应该有效:

  @Embeddable 
public class MemberAttributePk实现Serializable {
@Column(name =member_id)
protected long memberId;
@Column(name =name)
保护字符串名称;

public MemberAttributePk(){}

// get& set
}

@Entity
public class MemberAttribute {

@EmbeddedId
protected MemberAttributePk memberAttributePk;

@ManyToOne
@JoinColumn(name =member_id)
保护会员;

私有字符串值;

public MemberAttribute(){}

// get&设置
}

或者与 @ClassId
$ p $ public class MemberAttributePk implements Serializable {
protected long memberId;
保护字符串名称;

public MemberAttributePk(){}

// get&设置
}

@Entity
@IdClass(MemberAttributePk.class)
public class MemberAttribute {
@Id
@Column(name = member_id)
保护长会员Id;

@Id
@Column(name =name)
保护字符串名称;

@ManyToOne
@JoinColumn(name =member_id)
保护会员;

私有字符串值;

public MemberAttribute(){}

// get&设置
}


I have the following setup:

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

And the id class:

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

    public MemberAttributePk() {}

    // get & set
}

I have defined a simple Spring Data repository for MemberAttribute:

@Repository
public interface MemberAttributeRepo extends JpaRepository<MemberAttribute, MemberAttributePk> {
}

Now, all I want to do is persist a member attribute to the database:

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

However, I end up with this server exception:

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

Any idea what am I doing wrong? Thanks!

解决方案

Simply your code is not JPA compliant. The cause of problem is that you use Member as a part of your PK. The PK can only be made up of fields of the following Java types

  1. Primitives : boolean , byte , char , int , long , short
  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


This should work:

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

Or the same with @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
}

这篇关于无法使用@IdClass转换实体中的请求元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆