Исключение гибернации "PropertyValueException: свойство not-null ссылается на> нулевое или временное значение".Я застрял и не знаю, что делать - PullRequest
0 голосов
/ 19 февраля 2019

Здесь вы можете увидеть диаграмму взаимосвязи сущностей моей базы данных с ассоциациями

Я занимаюсь разработкой программы управления запасами Hibernate с использованием Apache Derby в NetBeans.Приложение попросит пользователя выбрать предварительно введенного Проекта / Партнера из базы данных Партнеров и ввести дату (см. ERD выше).Пользователь может выбрать, являются ли элементы входящими или исходящими из инвентаря.Предположительно, это создаст запись Advicenote в таблице Advicenote следующим образом:

Пользовательский интерфейс выбора

Тогда в следующем окне пользователь сможет фактически установить транзакциюзначение, связанное с Advicenote:

Следующее окно ввода

Вот код со слушателями, который будет реализовывать это:

private void deliveryButtonActionPerformed(java.awt.event.ActionEvent evt) {                                               
    session = sessionFactory.openSession();
    transaction = session.beginTransaction();
    advice.setAdvicedate((Date) this.dateSpinner.getValue());
    advice.setInOrOut((short)1);
    Criteria criteria = session.createCriteria(Partner.class);
    partner = (Partner) criteria.add(Restrictions.eq("partnerName", this.partnerComboBox.getSelectedItem())).uniqueResult();
    System.out.println("partner");
    advice.setPartner(partner);
    session.save(advice);
    transaction.commit();
    session.close();
    delivery.setVisible(true);
}                                              

private void transferButtonActionPerformed(java.awt.event.ActionEvent evt) {                                               
    session = sessionFactory.openSession();
    transaction = session.beginTransaction();
    advice.setAdvicedate((Date) this.dateSpinner.getValue());
    advice.setInOrOut((short)-1);
    Criteria criteria = session.createCriteria(Partner.class);
    partner = (Partner) criteria.add(Restrictions.eq("partnerName", this.partnerComboBox.getSelectedItem().toString())).uniqueResult();
    advice.setPartner(partner);
    session.save(advice);
    transaction.commit();
    session.close();
    transfer.setVisible(true);
} 

Вот файлы сопоставления 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.Partner" table="PARTNER" schema="APP">
        <id name="partnerId" type="int">
            <column name="PARTNER_ID"/>
            <generator class="native"/>
        </id>
        <property name="partnerName" type="string" column="PARTNER_NAME" length="100"/>
        <set name="advicenotes" table="ADVICENOTE" inverse="false" cascade="all" lazy="true" fetch="select">
            <key column="PARTNER_ID" not-null="true"/>
            <one-to-many class="classes.Advicenote" />
        </set>
            </class>
</hibernate-mapping>

Класс Advicenote

<?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.Advicenote" table="ADVICENOTE" schema="APP" optimistic-lock="version">
        <id name="advicenoteId" type="int" column="ADVICENOTE_ID">
            <generator class="native" />
        </id>
        <property name="advicedate" type="date" column="ADVICE_DATE" length="10" />
        <property name="inOrOut" type="java.lang.Short" column="IN_OR_OUT" />
        <many-to-one 
            name="partner" class="classes.Partner"/>  
        <set name="transactions" table="TRANSACTIONS" inverse="false" cascade="all" lazy="true" fetch="select">       
            <key column="ADVICENOTE_ID" not-null="true"/>
            <one-to-many class="classes.Transactions"/>
        </set>
    </class>
</hibernate-mapping>

Однако я получаю эту ошибку:

Исключение в потоке "AWT-EventQueue-0" org.hibernate.PropertyValueException: свойство not-null ссылается на нулевое или временное значение: классы.Advicenote._classes.Partner.advicenotesBackref at org.hibernate.engine.internal.Nullability.checkNullability (Nullability.java:111) в org.hibernate.engine.internal.Nullability.checkNullability (Nullability.javah55).action.internal.AbstractEntityInsertAction.nullifyTransientReferencesIfNotAlready (AbstractEntityInsertAction.java:115) в org.hibernate.action.internal.EntityIdentityInsertAction.execute (EntityIdentityInsertAction.java:69 )exex.jpg.jpgв org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction (ActionQueue.java:282) в org.hibernate.engine.spi.ActionQueue.addInsertAction (ActionQueue.java:263) в org.hibernate.engineQue.Aid.spad.a.(ActionQueue.java:317) в org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction (AbstractSaveEventListener.java:332) в org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrRepava.istenhister.event.internal.AbstractSaveEventListener.performSave (AbstractSaveEventListener.java:196) в org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId (AbstractSaveEventListener.java:127) в org.hibernate.event.ternal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId (DefaultSaveOrUpdateEventListener.java:192) при org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId (DefaultSaveEventListener.java:38) в org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient (DefaultSaveOrUpdateEventListener.java:177)по адресу org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate (DefaultSaveEventListener.java:32) по адресу org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate (DefaultSaveavaemp.SiGateIventState.IventSigner.SecateSignSigner_Server_Signer_Signer_Server_Signer_Secate_Secate_Secate_Signer_Rate_Secate_Secate_IventSecate_Secate_SignS_Server_Signer_Server_Signer_Serv_Sec..java: 713) в org.hibernate.internal.SessionImpl.save (SessionImpl.java:705) в org.hibernate.internal.SessionImpl.save (SessionImpl.java:700) в delivery.view.Selection.deliveryButtonActionPerformed (выбор.Java: 190) на delivery.view.Selection $ 2.actionPerformed (Selection.java:106) на 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 (DefaultButtonModek) java)/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262) вjava.desktop / javax.swing.plaf.basic.BasicButtonListener.mouseReleased (BasicButtonListener.java:279) в java.desktop / java.awt.AWTEventMulticaster.mouseReleased (AWTEventMulticaster.java:297) в java.kt / java.kt.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.Container.processEvent (Container.java:2263) в java.desktop / java.awt.Component.dispatchEventImpl (Component.java:5008) в java.desktop / java.awt.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.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772) в java.desktop / java.awt.EventQueue $ 4.run (EventQueue.java:721) в java.desktop / java.awt.EventQueue $ 4.rueue.java: 715) в java.base / java.security.AccessController.doPrivileged (собственный метод) в java.base / java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:85) в java.base / java..ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:95) в java.desktop / java.awt.EventQueue $ 5.run (EventQueue.java:745) в java.desktop / java.awt.EventQueue $ 5.run (Событие $ 5.run (: 743) в java.base / java.security.AccessController.doPrivileged (собственный метод) в java.base / java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:85) в java.desktop / java.awt.EventQueue.dispatchEvent (EventQueue.java:742) в java.desktop / java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java:203) в java.desktop.jpgjava: 124) в java.desktop / java.awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java:113) в java.desktop / java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:awttop java.awdes.top jjava:10t at)..EventDispatchThread.pumpEvents (EventDispatchThread.java:101) в java.desktop / java.awt.EventDispatchThread.run (EventDispatchThread.java:90)

Я пытался целую вечность, чтобырешить это без удачи.Буду рад любой помощи!

1 Ответ

0 голосов
/ 19 февраля 2019

Вы определили двунаправленное отображение, но вы устанавливаете только одну сторону.

Вы должны установить partner в AdviceNote, а также заполнить advicenotes Set на Partner:

advice.setPartner(partner);
partner.getAdviceNotes().add(advice);
session.save(advice);
transaction.commit();
...