java - Hibernate Javax持久性: object is not an instance of declaring class

标签 java hibernate persistence persist

我想使用 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/

相关文章:

java - StackOverflow 错误设置多对多关系 Spring JPA

java - Play! 中的抽象模型界面ORM,如何加载 initial-data.yml?

java - 使用正则表达式搜索 unicode 文本

java - 使用 Jackson 将 GeoJSON 映射到 Java

java - 如何在 Hibernate Criteria 中表达此 SQL(可能?)

java - @TableGenerator 的初始值属性在 Hibernate 中显示问题,但在 JPA 中则不然

java - 持久对象异常 : detached entity passed to persist - Got this exception when run method 2nd time

java - 由sequencegenerator生成的主键错误地写入数据库

java - N 体模拟 - 在某些情况下不计算物体的力

java - 为什么 Comparator 应该实现 Serializable?