【问题标题】:Hibernate/JPA: could not set a field value by reflection setterHibernate/JPA:无法通过反射设置器设置字段值
【发布时间】:2011-06-25 23:19:47
【问题描述】:

我的 JPA/Hibernate 奥德赛继续……

我正在尝试解决this issue,因此我不得不在我的类中定义原始@Ids,它使用3 个实体字段作为复合键。这似乎让我更进一步,但现在我在坚持时得到了这个:

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 生成)。

这是我的库。我并不完全相信我正在使用一组兼容的持久性库(对详细说明如何正确混合和匹配这些的食谱的参考将不胜感激。)

  • 休眠 3.5.6-SNAPSHOT
  • hibernate-jpamodelgen 1.1.0.CR1
  • 休眠验证器 3.1.0.GA
  • MySQL 5.1.6
  • jsr250-api 1.0
  • javax.validation 验证-api 1.0.0.GA

哇,真令人沮丧。现在有 3 天的时间全职尝试解决像这样的各种问题,只是为了基本的 ORM。我觉得有缺陷。 :-(

【问题讨论】:

  • 谢谢亚瑟,但在我的情况下,这是一个单向的关系。此外,我确实尝试将我的注释移动到 getter,但这似乎没有帮助。
  • 你有@IdClass吗?同时从staffer 中删除@Id
  • axtavt- 我试过@IdClass。我从中得到另一个更奇怪的错误:“原因:java.sql.SQLException:参数索引超出范围(5 > 参数数量,即 4)。”是的,您应该从 Staffer 中删除 @Id 是非常正确的,因为它是在原语上定义的,谢谢。
  • 您找到解决此问题的方法了吗?我面临着类似的事情......

标签: java hibernate jpa


【解决方案1】:

您必须删除 @GeneratedValue 注释。

【讨论】:

    【解决方案2】:

    这似乎是一个正确的代码。当我使用 Blob[]

    时,我遇到了这个异常的问题
    @Lob
    @Column(name="DOCUMENTO",nullable=false)
    private Blob[] documento;
    

    但是通过 Byte[] 改变,我解决了这个问题。

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

    我假设您的 ID 是整数....为什么不将 Long 更改为 Integer?你必须记住它只接受原始类型。

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-07
      • 2015-06-15
      • 2019-04-22
      • 2020-06-10
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2010-09-14
      • 2019-05-15
      相关资源
      最近更新 更多