Im试图使用休眠在MySQL数据库中插入一个条目。但是我收到了一个IllegalArgumentException。 id是数据库中的主键,我检查了autoincrement选项。
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 + "]";
}
}
我知道修饰符应该是私有的。我正在使用最新版本的JDBC并从maven存储库中休眠。
compile 'org.hibernate:hibernate-agroal:5.3.10.Final'
compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.15'
答案 0 :(得分: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中可以访问它们。