it-swarm.com.de

die Nicht-Null-Eigenschaft verweist auf einen Nullwert oder einen Übergangswert

Probleme beim Speichern von Eltern/Kind-Objekten mit Ruhezustand. Jede Idee wäre sehr dankbar.

org.hibernate.PropertyValueException: not-null property references a null or transient value: example.forms.InvoiceItem.invoice
    at org.hibernate.engine.Nullability.checkNullability(Nullability.Java:100)
        .... (truncated)

hibernate-Mapping:

<hibernate-mapping package="example.forms">
    <class name="Invoice" table="Invoices">
        <id name="id" type="long">
            <generator class="native" />
        </id>
        <property name="invDate" type="timestamp" />
        <property name="customerId" type="int" />
        <set cascade="all" inverse="true" lazy="true" name="items" order-by="id">
            <key column="invoiceId" />
            <one-to-many class="InvoiceItem" />
        </set>
    </class>
    <class name="InvoiceItem" table="InvoiceItems">
        <id column="id" name="itemId" type="long">
            <generator class="native" />
        </id>
        <property name="productId" type="long" />
        <property name="packname" type="string" />
        <property name="quantity" type="int" />
        <property name="price" type="double" />
        <many-to-one class="example.forms.Invoice" column="invoiceId" name="invoice" not-null="true" />
    </class>
</hibernate-mapping>

InvoiceManager.Java

class InvoiceManager {

    public Long save(Invoice theInvoice) throws RemoteException {
        Session session = HbmUtils.getSessionFactory().getCurrentSession();
        Transaction tx = null;
        Long id = null;
        try {
            tx = session.beginTransaction();
            session.persist(theInvoice);
            tx.commit();
            id = theInvoice.getId();
        } catch (RuntimeException e) {
            if (tx != null)
                tx.rollback();
            e.printStackTrace();
            throw new RemoteException("Invoice could not be saved");
        } finally {
            if (session.isOpen())
                session.close();
        }
        return id;
    }
}

Rechnung.Java

public class Invoice implements Java.io.Serializable {
    private Long id;
    private Date invDate;
    private int customerId;
    private Set<InvoiceItem> items;

    public Long getId() {
        return id;
    }
    public Date getInvDate() {
        return invDate;
    }
    public int getCustomerId() {
        return customerId;
    }
    public Set<InvoiceItem> getItems() {
        return items;
    }
    void setId(Long id) {
        this.id = id;
    }
    void setInvDate(Date invDate) {
        this.invDate = invDate;
    }
    void setCustomerId(int customerId) {
        this.customerId = customerId;
    }
    void setItems(Set<InvoiceItem> items) {
        this.items = items;
    }
}

InvoiceItem.Java

public class InvoiceItem implements Java.io.Serializable {
    private Long itemId;
    private long productId;
    private String packname;
    private int quantity;
    private double price;
    private Invoice invoice;

    public Long getItemId() {
        return itemId;
    }
    public long getProductId() {
        return productId;
    }
    public String getPackname() {
        return packname;
    }
    public int getQuantity() {
        return quantity;
    }
    public double getPrice() {
        return price;
    }
    public Invoice getInvoice() {
        return invoice;
    }
    void setItemId(Long itemId) {
        this.itemId = itemId;
    }
    void setProductId(long productId) {
        this.productId = productId;
    }
    void setPackname(String packname) {
        this.packname = packname;
    }
    void setQuantity(int quantity) {
        this.quantity = quantity;
    }
    void setPrice(double price) {
        this.price = price;
    }
    void setInvoice(Invoice invoice) {
        this.invoice = invoice;
    }
}
59
WSK

Jedem InvoiceItem muss ein Invoice mit dem not-null="true" in der Zuordnung many-to-one zugeordnet sein. 

Die Grundidee ist also, dass Sie diese explizite Beziehung im Code einrichten müssen. Dafür gibt es viele Möglichkeiten. In Ihrer Klasse sehe ich eine setItems-Methode. Ich sehe keine addInvoiceItem-Methode. Wenn Sie Elemente festlegen, müssen Sie das Set durchlaufen und item.setInvoice(this) für alle Elemente aufrufen. Wenn Sie eine addItem-Methode implementieren, müssen Sie dasselbe tun. Oder Sie müssen ansonsten die Rechnung aller InvoiceItem in der Sammlung festlegen.

36
hvgotcodes

für Follower kann diese Fehlermeldung auch bedeuten, dass sie auf ein Fremdobjekt verweist, das noch nicht in der Datenbank gespeichert wurde (obwohl es vorhanden ist und nicht null ist).

70
rogerdpack

Dies könnte so einfach sein wie:

@Column(name = "Some_Column", nullable = false)

der Wert von "Some_Column" ist jedoch null, auch wenn "Some_Column" möglicherweise kein Primär- oder Fremdschlüssel ist.

3
Sandeep Jindal

Überprüfen Sie die nicht gespeicherten Werte für Ihren Primärschlüssel/Ihre Objekt-ID in Ihren hbm-Dateien. Wenn Sie die ID-Erstellung über das Hibernate-Framework automatisiert haben und die ID irgendwo festlegen, wird dieser Fehler ausgegeben. Standardmäßig ist der nicht gespeicherte Wert 0. Wenn Sie die ID auf 0 setzen, wird dieser Fehler angezeigt.

2
Rohitdev

Ich löste mich durch Entfernen der @ Basic (optional = false) Eigenschaft Oder Aktualisieren Sie einfach boolean @Basic (optional = true)

Ich habe den gleichen Fehler erhalten, aber das Problem wurde schließlich behoben. Eigentlich habe ich die bereits gesicherte Object-Entity nicht für die andere Entität festgelegt, und daher war der Object-Wert, den es für den foreeign-Schlüssel erhielt, null.

0
Pratswinz