是啥导致“java.lang.IllegalArgumentException:无法设置 java.lang.Integer 字段”

Posted

技术标签:

【中文标题】是啥导致“java.lang.IllegalArgumentException:无法设置 java.lang.Integer 字段”【英文标题】:What causes "java.lang.IllegalArgumentException: Can not set java.lang.Integer field"是什么导致“java.lang.IllegalArgumentException:无法设置 java.lang.Integer 字段” 【发布时间】:2014-12-12 21:56:10 【问题描述】:

我无法解决这些异常

 Can not set java.lang.Integer field GcmRegistraionIdentity.gcmId to GcmRegistraionIdentity

org.hibernate.PropertyAccessException: could not get a field value by reflection getter of GcmRegistraionIdentity.gcmId

我的动态 Web 项目 (Jee7) 的目标是

GlassFish Server Open Source Edition  4.1  (build 13)

休眠

Hibernate Core 4.3.7.Final

我的 Persistence.xml

<persistence version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="testPU" transaction-type="JTA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>jdbc/testDB</jta-data-source>
        <properties>
            <property name="hibernate.transaction.jta.platform"
                value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.mysql5InnoDBDialect" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

这是我的 EDITED 实体类(部分:例如 Getters/Setters NOT SHOWN

@Entity
@Table(name = "gcm_registration")
public class GcmRegistraionIdentity 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "gcm_id", unique = true, nullable = false, insertable = false, updatable = false)
    private Integer gcmId;

    @Column(name = "registration_id")
    private String registraionId = null;

    @Column(name = "created")
    @Temporal(TemporalType.TIMESTAMP)
    private Date created;

    public Integer getGcmId() 
        return gcmId;
    

    public void setGcmId(final Integer gcmId) 
        this.gcmId = gcmId;
    

Mysql版本是

Version 5.6.22 MySQL Community Server (GPL)

我正在运行Mac OS X 10.10.1 (14B25) (Yosemite)

这是我的 JAX-RS 类

@Path("registrations")
@Stateless
public class RegistrationResource 

    @PersistenceContext
    private EntityManager mEntityManager;

    @POST
    @Path("gcm")
    public void register(final RegistrationIdJson registrationId) 

        final GcmRegistraionIdentity gcmRegistraionIdentity = new GcmRegistraionIdentity();
        gcmRegistraionIdentity.setRegistraionId(registrationId.getRegistrationId());

        mEntityManager.persist(gcmRegistraionIdentity);

    


这是我的 MySql 表的 DDL

CREATE TABLE `gcm_registration` (
  `gcm_id` int(11) NOT NULL AUTO_INCREMENT,
  `registration_id` varchar(1024) NOT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`gcm_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

【问题讨论】:

【参考方案1】:

我建议更改 id 字段的名称。 更改表并将列更新为“id”。我认为“_id”在休眠时正在做一些有趣的事情。

【讨论】:

我的 GcmRegistration 类有 getter 和 setter,我只是懒得浪费空间和时间将它们粘贴到我的问题中,因此我声明“继承我的实体类(部分)” 嗯。我们不应该将 id 生成留给数据库,因为我们用 GeneratedValue 对其进行了注释。您可以尝试在不设置主键的情况下进行持久化吗= 我没有设置主键。这就是为什么我指定了@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "gcm_id", unique = true, nullable = false, insertable = false, updatable = false)【参考方案2】:

解决办法是替换

Hibernate Core 4.3.7.Final

Hibernate Core 4.3.5.Final

无需其他代码或配置更改

【讨论】:

以上是关于是啥导致“java.lang.IllegalArgumentException:无法设置 java.lang.Integer 字段”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 的 YML 文件中创建条件属性?

是啥导致 HttpHostConnectException?

是啥导致此 BadDeviceToken 响应?

是啥导致了这个推进错误?

是啥导致了 NSInvalidArgumentException?

是啥导致移动构造函数被删除