java - Hibernate PropertyAccessException:调用 getter 时发生 IllegalArgumentException?发生了什么?
问题描述
当我运行以下代码以显示属于 JTable 中特定类别的项目时,我收到此异常:
private void categoryComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
try {
DefaultTableModel dtm = new DefaultTableModel();
String cat = this.categoryComboBox.getSelectedItem().toString();
session=sessionFactory.openSession();
transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Items.class);
//HERE LIES THE PROBLEM BUT I HAVE NO CLUE HOW TO SOLVE IT
List<Items> itemlist = criteria.add(Restrictions.eq("category", cat).ignoreCase()).list();
transaction.commit();
session.close();
if (dtm.getColumnCount()==0) {
dtm.addColumn("Name");
dtm.addColumn("Category");
dtm.addColumn("Quantity");
dtm.addColumn("Net Price (per unit)");
dtm.addColumn("Gross Pice (per unit)");
dtm.addColumn("Net Price (total)");
dtm.addColumn("Gross Price (total)");
}
Font f = new Font("Georgia", Font.BOLD, 16);
JTableHeader header = itemTable.getTableHeader();
header.setFont(f);
itemTable.setRowHeight(25);
if (getQuantity().isEmpty()) {for (int i = 0; i < itemlist.size(); i++) {
dtm.addRow(new Object[]{itemlist.get(i).getName(), itemlist.get(i).getCategory().getName(),"-",itemlist.get(i).getNetPrice(), Math.round((Double.valueOf(itemlist.get(i).getNetPrice())*(1d+itemlist.get(i).getVatRate()/100d))), "-", "-"});
}
} else {
for (int i = 0; i < itemlist.size(); i++) {
dtm.addRow(new Object[]{itemlist.get(i).getName(), itemlist.get(i).getCategory().getName(), getQuantity().get(itemlist.get(i).getItemId()).getQuantity(), itemlist.get(i).getNetPrice(), itemlist.get(i).getNetPrice()*(itemlist.get(i).getVatRate()+1), getQuantity().get(itemlist.get(i).getItemId()).getQuantity()*itemlist.get(i).getNetPrice(), itemlist.get(i).getNetPrice()*(itemlist.get(i).getVatRate()+1)*getQuantity().get(itemlist.get(i).getItemId()).getQuantity()});
}
}
this.itemTable.setModel(dtm);} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage());
e.printStackTrace();
}
}
这里还有我的 XML 映射类:
Caregories.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Feb 9, 2019, 3:57:52 PM by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
<class name="classes.Categories" table="CATEGORIES" schema="APP" optimistic-lock="version">
<id name="categoryId" type="int">
<column name="CATEGORY_ID" />
<generator class="native" />
</id>
<property name="name" type="string">
<column name="NAME" length="100" />
</property>
<set name="items" table="ITEMS" inverse="false" cascade="all" lazy="false" fetch="select">
<key>
<column name="CATEGORY_ID" not-null="true" />
</key>
<one-to-many class="classes.Items" />
</set>
</class>
</hibernate-mapping>
项目.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="classes.Items" table="ITEMS" schema="APP" optimistic-lock="version">
<id name="itemId" type="int" column="ITEM_ID">
<generator class="native" />
</id>
<property name="name" type="string" column="NAME" length="100"/>
<property name="netPrice" type="java.lang.Integer" column="NET_PRICE"/>
<property name="vatRate" type="java.lang.Integer" column="VAT_RATE"/>
<many-to-one name="category" class="classes.Categories" fetch="select" column="CATEGORY_ID" not-null="true" lazy="false"/>
</class>
</hibernate-mapping>
分类.java
package classes;
// Generated Feb 9, 2019, 3:57:50 PM by Hibernate Tools 4.3.1
import java.util.Set;
public class Categories implements java.io.Serializable {
private int categoryId;
private String name;
private Set<Items> items;
public Categories() {
}
public Categories(int categoryId, String name, Set<Items> items) {
this.categoryId = categoryId;
this.name = name;
this.items = items;
}
public int getCategoryId() {
return this.categoryId;
}
public void setCategoryId(int categoryId) {
this.categoryId = categoryId;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Set<Items> getItems() {
return items;
}
public void setItems(Set<Items> items) {
this.items = items;
}
}
项目.java
package classes;
public class Items implements java.io.Serializable {
private int itemId;
private String name;
private Integer netPrice;
private Integer vatRate;
private Categories category;
public Items() {
}
public Items(int itemId, String name, Integer netPrice, Integer vatRate, Categories category) {
this.itemId = itemId;
this.name = name;
this.netPrice = netPrice;
this.vatRate = vatRate;
this.category = category;
}
public int getItemId() {
return this.itemId;
}
public void setItemId(int itemId) {
this.itemId = itemId;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Integer getNetPrice() {
return this.netPrice;
}
public void setNetPrice(Integer netPrice) {
this.netPrice = netPrice;
}
public Integer getVatRate() {
return this.vatRate;
}
public void setVatRate(Integer vatRate) {
this.vatRate = vatRate;
}
public Categories getCategory() {
return category;
}
public void setCategory(Categories category) {
this.category = category;
}
}
org.hibernate.PropertyAccessException: IllegalArgumentException 在 org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier( AbstractEntityTuplizer.java:224) 在 org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4933) 在 org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4633) 在 org.hibernate.engine .internal.ForeignKeys.isTransient(ForeignKeys.java:226) 在 org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:276) 在 org.hibernate.type.EntityType.getIdentifier(EntityType.java:495) 在org.hibernate.type.EntityType。nullSafeSet(EntityType.java:288) at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:2102) at org.hibernate.loader.Loader.bindParameterValues(Loader.java:2071) at org.hibernate.loader.Loader .prepareQueryStatement(Loader.java:2006) 在 org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1920) 在 org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1898) 在 org.hibernate.loader。 Loader.doQuery(Loader.java:937) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:340) at org.hibernate.loader.Loader.doList(Loader.java:2695) at org.hibernate.loader .Loader.doList(Loader.java:2678) 在 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2512) 在 org.hibernate.loader.Loader.list(Loader.java:2507) 在 org.hibernate。 loader.criteria。CriteriaLoader.list(CriteriaLoader.java:109) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1999) at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:370) at stock.view.StockView .categoryComboBoxActionPerformed(StockView.java:530) at stock.view.StockView$FormListener.actionPerformed(StockView.java:344) at java.desktop/javax.swing.JComboBox.fireActionEvent(JComboBox.java:1264) at java.desktop/ javax.swing.JComboBox.contentsChanged(JComboBox.java:1337) 在 java.desktop/javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:123) 在 java.desktop/javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java: 94) 在 java.desktop/javax.swing.JComboBox 的 java.desktop/javax.swing.DefaultComboBoxModel.addElement(DefaultComboBoxModel.java:132)。addItem(JComboBox.java:716) at stock.view.StockView.FillUpComboBox(StockView.java:103) at stock.view.StockView.(StockView.java:41) at main.view.MainMenu.stockMenuItemActionPerformed(MainMenu.java: 290) 在 main.view.MainMenu$FormListener.actionPerformed(MainMenu.java:240) 在 java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967) 在 java.desktop/javax.swing.AbstractButton$Handler .actionPerformed(AbstractButton.java:2308) 在 java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405) 在 java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262) 在 java.桌面/javax.swing.AbstractButton.doClick(AbstractButton.java:369) 在 java.desktop/javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1020) 在 java.desktop/java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:297) 在 java.desktop/java.desktop/java.desktop/javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1064) /java.awt.Component.processMouseEvent(Component.java:6632) 在 java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342) 在 java.desktop/java.awt.Component.processEvent(Component.java :6397) 在 java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5008) 在 java.desktop/java.awt 的 java.desktop/java.awt.Container.processEvent(Container.java:2263)。 Container.dispatchEventImpl(Container.java:2321) 在 java.desktop/java.awt.Component.dispatchEvent(Component.java:4840) 在 java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918) 在 java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547) 在 java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488) 在 java.desktop/java.awt.Container .dispatchEventImpl(Container.java:2307) 在 java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772) 在 java.desktop/java.awt.Component.dispatchEvent(Component.java:4840) 在 java.桌面/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772) 在 java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721) 在 java.desktop/java.awt.EventQueue$4.run( EventQueue.java:715) 在 java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) 在 java.base/java.base/java.security.AccessController.doPrivileged(Native Method)。安全。ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95) 在 java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745) 在 java.desktop/java.awt.EventQueue$5.run(EventQueue.java: 743) 在 java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) 在 java.desktop/java.awt.EventQueue 的 java.base/java.security.AccessController.doPrivileged(Native Method)。 dispatchEvent(EventQueue.java:742) 在 java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) 在 java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) 在 java.desktop /java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) 在 java.desktop/java.awt.EventDispatchThread。pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 原因:java .lang.IllegalArgumentException:对象不是在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.hibernate.property .access.spi.GetterMethodImpl.get(GetterMethodImpl.java:42) ... 71 更多java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 处的 EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 原因:java.lang.IllegalArgumentException:对象不是 java.base 中声明类的实例/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:42) .. . 71 更多java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 处的 EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 原因:java.lang.IllegalArgumentException:对象不是 java.base 中声明类的实例/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:42) .. . 71 更多90) 原因:java.lang.IllegalArgumentException:对象不是在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl 的 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 处声明类的实例。在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 调用(NativeMethodAccessorImpl.java:62)在 org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:42) ... 71 更多90) 原因:java.lang.IllegalArgumentException:对象不是在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl 的 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 处声明类的实例。在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 调用(NativeMethodAccessorImpl.java:62)在 org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:42) ... 71 更多62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.hibernate.property .access.spi.GetterMethodImpl.get(GetterMethodImpl.java:42) ... 71 更多62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.hibernate.property .access.spi.GetterMethodImpl.get(GetterMethodImpl.java:42) ... 71 更多
解决方案
criteria.add(Restrictions.eq("category", cat).ignoreCase())
这是错误的。您无法将关系与字符串进行比较。这是一个直接来自 Hibernate 文档的示例,应该如何完成:
List<Items> itemlist = sess.createCriteria(Items.class)
.createAlias("category",c)
.add( Restrictions.eq("c.name", cat))
.list();
https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html
另一个观察结果是您使用的是 inverse = false 。IMO 你希望它是 inverse=true
推荐阅读
- r - 根据分位数的接近程度更改向量的值
- java - Java - ImageIcon 不重新加载更新文件
- php - Wordpress CF7 根据所选主题直接发送电子邮件
- nodemailer - 我们可以使用 nodemailer 将动态加载的 html 文件作为电子邮件发送吗
- redirect - cmd.exe 和重定向的有趣观察
- c++ - C++ ifstream XCode / VSCode
- sql - postgresql如何显示每天最频繁的值
- php - 连接失败:SQLSTATE[HY000] [2002] 没有这样的文件或目录
- algorithm - 在 Dafny 中拥有属性的最长序列
- python - 在python中定义孔归档函数(根据数学定义)的问题