【问题标题】:Hibernate: java.lang.IllegalArgumentException: Can not set int field休眠:java.lang.IllegalArgumentException:无法设置 int 字段
【发布时间】:2019-05-02 16:18:01
【问题描述】:

我正在尝试使用休眠在我的 MySQL 数据库中插入一个条目。但我得到了一个 IllegalArgumentException。 id 是我数据库中的主键,我检查了自动增量选项。

org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [public int com.nexus.tutorial.Items.id] by reflection for persistent property [com.nexus.tutorial.Items#id] : Items [name=test, price=20.0, lagerstand=5, anfver=ankauf, position=0,0,0]
...
...
...
Caused by: java.lang.IllegalArgumentException: Can not set int field com.nexus.tutorial.Items.id to com.nexus.tutorial.Items
        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
        at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
        at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:56)
        at java.lang.reflect.Field.getInt(Field.java:574)
        at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:62)
public class HibernateUpdate {

    public static void update(Items item) {

        SessionFactory factory = new Configuration()
                .configure("C:\\Users\\N3XUS\\AppData\\\\Roaming\\.minecraft\\config\\hibernate.cfg.xml")
                .addAnnotatedClass(Items.class)
                .buildSessionFactory();

        Session session = factory.getCurrentSession();

        try {
            System.out.println("Creating new Items");
            session.beginTransaction();
            //List<Items> itemList = session.createQuery("from Items").list();
            session.save(item);
            session.getTransaction().commit();

        }finally {
            factory.close();
        }
    }

}

这就是我调用方法的方式:

HibernateUpdate.update(new Items("test", 20.00, 5,"ankauf","0,0,0"));

这是我的模型:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="items")
public class Items {

    @Id
    @Column(name="id")
    public int id;

    @Column(name="name")
    public String name;

    @Column(name="price")
    public double price;

    @Column(name="lagerstand")
    public int lagerstand;

    @Column(name="anfver")
    public String anfver;

    @Column(name="position")
    public String position;

    public Items() {

    }

    public Items(String name, double price, int lagerstand, String anfver, String position) {
        this.name = name;
        this.price = price;
        this.lagerstand = lagerstand;
        this.anfver = anfver;
        this.position = position;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getLagerstand() {
        return lagerstand;
    }

    public void setLagerstand(int lagerstand) {
        this.lagerstand = lagerstand;
    }

    public String getAnfver() {
        return anfver;
    }

    public void setAnfver(String anfver) {
        this.anfver = anfver;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }

    @Override
    public String toString() {
        return "Items [name=" + name + ", price=" + price + ", lagerstand=" + lagerstand + ", anfver=" + anfver
                + ", position=" + position + "]";
    }

}

我知道修饰符应该是私有的。我正在使用来自 maven-repository 的 JDBC 和休眠的最新版本。

    compile 'org.hibernate:hibernate-agroal:5.3.10.Final'
compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.15'

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

    您必须使用GeneratedValue 来确保您的 id 是自动递增的:

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    public int id;
    

    在此之后,您的 ID 会自动递增,您可以添加您的项目:

    HibernateUpdate.update(new Items("test", 20.00, 5,"ankauf","0,0,0"));
    

    建议:您的首选属性必须是私有的或受保护的,并且 您可以从 getter 和 setter 访问它们。

    【讨论】:

    • 我试过了,但我仍然得到同样的错误。我还尝试了不同的世代类型。但我不认为这是问题所在,因为我有一个使用休眠的示例程序,并且 Id 和列注释始终足以自动生成和增加 ID。
    • 哦,等等,这不是真的。错误有点不同,现在不是 id,但 anfver 字段有这个错误:rg.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.String com.nexus.tutorial.Items.anfver] by reflection for persistent property [com.nexus.tutorial.Items#anfver] : Items [name=name, price=20.0, lagerstand=50, anfver=test, position=test] caused by Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field com.nexus.tutorial.Items.anfver to com.nexus.tutorial.Items
    • 在你的 getter 中尝试 returnig this.anfver public String getAnfver() { return this.anfver; }
    • 那是一个不同的问题
    猜你喜欢
    • 2020-03-10
    • 2016-12-18
    • 1970-01-01
    • 2021-09-28
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多