在带有Spring Boot 2.2.7的休眠5.4版本中。我在例外之下。
Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of <Project path>.models.Book.isbn
at org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:65)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:223)
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:5119)
at org.hibernate.id.Assigned.generate(Assigned.java:31)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:115)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:194)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:179)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:626)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:619)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:614)
at com.vikas.projects.organicecommerce.jpahibernate.QueryExcecutableFile.test(QueryExcecutableFile.java:29)
at com.vikas.projects.organicecommerce.jpahibernate.OrganicEcommerceJpaHibernateApplication.main(OrganicEcommerceJpaHibernateApplication.java:21)
... 5 more
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:42)
我检查了其他相关链接,但是我无法将其与我的用例链接。 我正在使用以下配置和模型来保留Book对象。
Book.java
package com.vikas.projects.organicecommerce.jpahibernate.models;
import java.math.BigDecimal;
import java.sql.Date;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class Book {
private String isbn;
private String name;
private Date publishdate;
private BigDecimal price;
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getPublishdate() {
return publishdate;
}
public void setPublishdate(Date publishdate) {
this.publishdate = publishdate;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
}
book.hbm.xml
<hibernate-mapping>
<class name="...Book"
table="BOOK" lazy="false">
<id name="isbn">
<column name="ISBN" sql-type="varchar(13)" not-null="true" />
</id>
<property name="name">
<column name="NAME" sql-type="varchar(64)" not-null="true"
unique="true" />
</property>
<property name="publishdate">
<column name="PUBLISHDATE" sql-type="date" />
</property>
<property name="price">
<column name="PRICE" sql-type="decimal" precision="8"
scale="2" />
</property>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class"></property>
<property name="connection.url"></property>
<property name="connection.username"></property>
<property name="connection.password"></property>
<property name="hibernate.dialect"></property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping
resource=".../Book.hbm.xml" />
</session-factory>
</hibernate-configuration>
持久化此对象的方法
public void test() {
Book book = new Book();
book.setIsbn("1232424");
book.setName("BookName");
book.setPrice(new BigDecimal(23.00));
book.setPublishdate(Date.valueOf("2014-04-04"));
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.persist(book);
tx.commit();
session.close();
}
我正在使用Microsoft SQL Server。如果需要更多详细信息,请告诉我。
添加更多详细信息。从主函数中,我通过QueryExecutableFile的实例调用test()。
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class OrganicEcommerceJpaHibernateApplication {
public static void main(String[] args) {
SpringApplication.run(OrganicEcommerceJpaHibernateApplication.class, args);
QueryExcecutableFile queryExcecutableFile = new QueryExcecutableFile(getSessionFactory());
queryExcecutableFile.test();
}
public static SessionFactory getSessionFactory() {
Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
SessionFactory sessionFactory = configuration.buildSessionFactory();
return sessionFactory;
}
}
public class QueryExcecutableFile {
SessionFactory sessionFactory;
public QueryExcecutableFile(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void test() {
Book book = new Book();
book.setIsbn("1232424");
book.setName("BookName");
book.setPrice(new BigDecimal(23.00));
book.setPublishdate(Date.valueOf("2014-04-04"));
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.persist(book);
tx.commit();
session.close();
}
}