Java Hibernate/JPA:无法通过反射设置器设置字段值

Java Hibernate/JPA:无法通过反射设置器设置字段值,java,hibernate,jpa,Java,Hibernate,Jpa,我的JPA/Hibernate odyssey继续 我正在努力解决这个问题,所以我必须在我的类中定义使用3个实体字段作为复合键的基元@id。这似乎让我走得更远,但现在我在坚持的时候得到了: javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not set a field value by reflection setter of com.example.model.Langua

我的JPA/Hibernate odyssey继续

我正在努力解决这个问题,所以我必须在我的类中定义使用3个实体字段作为复合键的基元@id。这似乎让我走得更远,但现在我在坚持的时候得到了:

javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not set a field value by reflection setter of com.example.model.LanguageSkill.stafferId
这是我的复合类:

public class LanguageSkill implements Serializable
{
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    @Column(name = "Staffer_ID")
    private Long stafferId;

    @Id
    @ManyToOne(cascade = CascadeType.ALL)
    @MapsId(value = "stafferId")
    private Staffer staffer;

    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    @Column(name = "Language_ID")
    private Long languageId;

    @ManyToOne
    @MapsId(value= "languageId")
    private Language language;

    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    @Column(name = "Language_Proficiency_ID")
    private Long languageProficiencyId;

    @ManyToOne
    @MapsId(value= "languageProficiencyId")
    private LanguageProficiency languageProficiency;
}
对于原语和实体,我都有适当的getter和setter(IDE生成的)

这是我的图书馆。我并不完全相信我使用的是一套兼容的持久性库(如果能参考一本烹饪书,详细介绍如何正确地混合和匹配这些库,我将不胜感激。)

  • Hibernate 3.5.6-SNAPSHOT
  • hibernate jpamodelgen 1.1.0.CR1
  • hibernate验证程序3.1.0.GA
  • MySQL 5.1.6
  • jsr250 api 1.0
  • javax.validation api 1.0.0.GA

哇,真令人沮丧。现在有3天的全职时间来解决各种问题,比如基本的ORM。我觉得自己有缺陷-(

您必须删除
@GeneratedValue
注释。

这似乎是正确的代码。我在使用Blob[]时遇到了此异常问题

@Lob
@Column(name="DOCUMENTO",nullable=false)
private Blob[] documento;
但是通过改变字节[],我解决了这个问题

我只看到了一个实例,看看Oracle数据类型,我看到这个LONG是可变长度的字符数据(VARCHAR2数据类型的更大版本)。

我假设您的ID是一个整数……为什么不按整数更改Long?您必须记住,它只接受基本类型

这是我的代码,工作正常:

@Id
@SequenceGenerator(sequenceName="SQ_DOCUMENTO",name="seqDocumento")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seqDocumento")
private Integer idDocumento;

我使用的是Hibernate 3.5.6-final、Spring 3.0.4、Junit 4和Oracle 11g。

谢谢Arthur,但在我的例子中,这是单向关系。此外,我尝试过将注释移动到getter,但似乎没有帮助。你有
@IdClass
吗?还要从
员工中删除
@Id
。axtavt-我尝试过@IdCl我从中得到了另一个更奇怪的错误:“原因:java.sql.SQLException:参数索引超出范围(5>参数数量,即4)。”是的,您完全正确地认为@Id应该从Staffer中删除,因为它是在原语中定义的,谢谢。您找到了这个问题的解决方案吗?我面临着类似的问题。。。