【问题标题】:Hibernate Javax Persistence: object is not an instance of declaring classHibernate Javax Persistence:对象不是声明类的实例
【发布时间】:2019-12-27 11:57:08
【问题描述】:

我想使用休眠实体管理器将用户数据存储到数据库中。当我尝试持久化用户对象时遇到异常。不知何故,无法访问用户的 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>

【问题讨论】:

    标签: java hibernate persistence persist


    【解决方案1】:

    您不需要注释和 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 文件,因为您已经使用注释映射了所有内容。

    【讨论】:

    • 感谢您的回答!删除xml后,hibernate会抛出一个注解异常:org.hibernate.AnnotationException: @org.hibernate.annotations.Table references an unknown table: user。该表肯定存在,如果我离开 xml,则不会引发异常。
    • 删除 (appliesTo = "user")
    • 谢谢你!我读过一篇关于生成器类的博客,我选择了身份,但我不明白为什么它会尝试将 id 字段设置为导致非法参数异常的用户对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 2017-05-05
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    相关资源
    最近更新 更多