Hibernate Javax Persistence:对象不是声明类的实例

问题描述 投票:0回答:1

我想使用休眠实体管理器将用户数据存储到数据库中。尝试保留用户对象时遇到异常。某种程度上,无法访问用户的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

这是我的Entity类:

@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个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.