我想使用 hibernate 实体管理器将用户数据存储到数据库中。当我尝试保留用户对象时遇到异常。不知何故,无法访问用户 id 属性的 getter。我试图通过调试来解决这个问题,但它对我没有多大帮助。
Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.hosting.hostinginterface.spring.user.User.id
at org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:66) ~[hibernate-core-6.0.0.Alpha3.jar:6.0.0.Alpha3]
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:5411) ~[hibernate-core-6.0.0.Alpha3.jar:6.0.0.Alpha3]
at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:5036) ~[hibernate-core-6.0.0.Alpha3.jar:6.0.0.Alpha3]
at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:292) ~[hibernate-core-6.0.0.Alpha3.jar:6.0.0.Alpha3]
at org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:529) ~[hibernate-core-6.0.0.Alpha3.jar:6.0.0.Alpha3]
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:102) ~[hibernate-core-6.0.0.Alpha3.jar:6.0.0.Alpha3]
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:62) ~[hibernate-core-6.0.0.Alpha3.jar:6.0.0.Alpha3]
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108) ~[hibernate-core-6.0.0.Alpha3.jar:6.0.0.Alpha3]
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:680) ~[hibernate-core-6.0.0.Alpha3.jar:6.0.0.Alpha3]
... 76 common frames omitted
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_231]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_231]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_231]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_231]
at org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:43) ~[hibernate-core-6.0.0.Alpha3.jar:6.0.0.Alpha3]
... 84 common frames omitted
这是我的实体类:
@Table(appliesTo = "user")
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "username")
private String userName;
@Column(name = "firstName")
private String firstName;
@Column(name = "lastName")
private String lastName;
private LocalDate birthday;
@Column(name = "birthdate")
private String birthdayText;
public User() {
}
@Contract(pure = true)
public User(String userName, String firstName, String lastName, @NotNull LocalDate birthday) {
this.userName = userName;
this.firstName = firstName;
this.lastName = lastName;
this.birthday = birthday;
birthdayText = birthday.toString();
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public LocalDate getBirthday() {
return birthday;
}
public void setBirthday(LocalDate birthday) {
this.birthday = birthday;
}
public String getBirthdayText() {
return birthdayText;
}
public void setBirthdayText(String birthdayText) {
this.birthdayText = birthdayText;
}
public Long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
以下调用执行任务:
EntityManager entityManager = getInstance().entityManager;
entityManager.getTransaction().begin();
entityManager.persist(object);
entityManager.getTransaction().commit();
这是我的映射:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.hosting.hostinginterface.spring.user.User" table="user">
<id name="getUserName">
<generator class="native"/>
</id>
<property name="userName" column="username" type="java.lang.String" not-null="true"/>
<property name="firstName" column="firstname" type="java.lang.String" not-null="true"/>
<property name="lastName" column="lastname" type="java.lang.String" not-null="true"/>
<property name="birthdayText" column="birthday" type="java.lang.String" not-null="true"/>
<property name="id" column="id" type="java.lang.Long" not-null="true"/>
</class>
</hibernate-mapping>
最佳答案
您不需要注释和 XML。仅使用其中之一。
问题出在 XML 中的映射:
<id name="getUserName">
<generator class="native"/>
</id>
映射应该是:
<hibernate-mapping>
<class name="com.hosting.hostinginterface.spring.user.User" table="user">
<id name="id">
<generator class="identity"/>
</id>
<property name="userName" column="username" type="java.lang.String" not-null="true"/>
<property name="firstName" column="firstname" type="java.lang.String" not-null="true"/>
<property name="lastName" column="lastname" type="java.lang.String" not-null="true"/>
<property name="birthdayText" column="birthday" type="java.lang.String" not-null="true"/>
</class>
</hibernate-mapping>
但是您可以删除 XML 文件,因为您已经使用注释映射了所有内容。
关于java - Hibernate Javax持久性: object is not an instance of declaring class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59500451/