簡體   English   中英

Hibernate PropertyAccessException:發生IllegalArgumentException調用getter嗎? 發生了什么?

[英]Hibernate PropertyAccessException: IllegalArgumentException occurred calling getter? What happened?

當我運行下面的代碼以顯示屬於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>

Items.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>

這是我數據庫的實體關系圖 在此處輸入圖片說明

Categories.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;
    }


}

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調用類的getter。org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:65)的org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier( org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4933)的org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4633)的org.hibernate.engine org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:276)處的org.hibernate.type.EntityType.EntityType.getIdentifier(EntityType.java:495)處的.internal.ForeignKeys.isTransient(ForeignKeys.java:226) org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:2102)的org.hibernate.type.EntityType.nullSafeSet(EntityType.java:288)org.hibernate.loader.Loader.bindParameterValues(Loader.java:2071)在org.hibernate.loader.Load er.prepareQueryStatement(Loader.java:2006)位於org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1920)位於org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1898)位於org.hibernate.loader org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:340)在org.hibernate.loader.Loader.doList(Loader.java:2695)在org.hibernate的.Loader.doQuery(Loader.java:937)。 org.hibernate.loader.Loader.list的loader.Loader.doList(Loader.java:2678)org.hibernate的org.hibernate.loader.Loader.list(Loader.java:2507)的IgnoreQueryCache(Loader.java:2512)位於org.hibernate.internal.SessionImpl.list(SessionImpl.java:1999)的.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:109)位於org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:370) stock.view.StockView.categoryComboBoxActionPerformed(StockView.java:530)在stock.view.StockView $ FormListener.actionPerformed(StockView.java:344)在java.desktop / javax.swing.JComboBox.fireActionEvent(JComboBox.java:1264)一種 t java.desktop / javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:123)上的java.desktop / javax.swing.JComboBox.contentsChanged(JComboBox.java:1337)在java.desktop / javax.swing.DefaultComboBoxModel.setSelectedItem在stock.view的java.desktop / javax.swing.DefaultComboBoxModel.addElement(DefaultComboBoxModel.java:132)處(DefaultComboBoxModel.java:94)在java.desktop / javax.swing.JComboBox.addItem(JComboBox.java:716)處。在stock.view.StockView上的StockView.FillUpComboBox(StockView.java:103)在main.view.MainMenu.stockMenuItemActionActionPerformed(MainMenu.java:290)處在main.view.MainMenu $ FormListener.actionPerformed( MainMenu.java:240)at java.desktop / javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)at java.desktop / javax.swing.AbstractButton $ Handler.actionPerformed(AbstractButton.java:2308)at java.desktop /javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)位於java.desktop / javax.swing.DefaultButtonModel.setPressed(D java的java.desktop / javax.swing.AbstractButton.doClick(AbstractButton.java:369)的efaultButtonModel.java:262)java的java.desktop / javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1020)的efaultButtonModel.java:262)位於java.desktop / java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:297)的.desktop / javax.swing.plaf.basic.BasicMenuItemUI $ Handler.mouseReleased(BasicMenuItemUI.java:1064)在java.desktop / java.awt的java.desktop / javax.swing.JComponent.processMouseEvent(JComponent.java:3342)的.Component.processMouseEvent(Component.java:6632)的java.desktop / java.awt.Component.processEvent(Component.java:6397)的。 java.desktop / java.awt.Component.dispatchEventImpl(Component.java:5008)上的java.desktop / java.awt.Container.processEvent(Container.java:2263)(java.desktop / java.awt.Container.dispatchEventImpl(Component.java:5008)在java.desktop / java.awt.Component.dispatchEvent(Component.java:4840)處的Container.java:2321)在java.desktop / java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)處的java.desktop / j 位於java.desktop / java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)的ava.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)在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.desktop / java.awt.EventQueue .dispatchEventImpl(EventQueue.java:772)位於java.desktop / java.awt.EventQueue $ 4.run(EventQueue.java:721)at java.desktop / java.awt.EventQueue $ 4.run(EventQueue.java:715)at java.base / java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)上的java.base / java.security.AccessController.doPrivileged(本機方法)at java.base / java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) (ProtectionDomain.java:95)在java.desktop / java.awt.EventQueue $ 5.run(EventQueue.java:745)在java.desktop / java.awt.EventQueue $ 5.run(EventQueue.java:743)在j java.base / java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)處的ava.base / java.security.AccessController.doPrivileged(本機方法)java.desktop / java.awt.EventQueue.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.pumpEvents(EventDispatchThread.java:109)處的awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)在java.desktop / java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)在java.desktop / java.awt.EventDispatchThread.run(EventDispatchThread.java:90)造成原因:java.lang.IllegalArgumentException:object不是在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0上聲明類的實例。 (本機方法)位於java.base / jdk.internal.ref 位於java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)的lect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),位於java.base / java.lang.reflect.Method.invoke(Method。 java:566)at 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,您希望它為逆= true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM