Свойство not-null ссылается на нулевое или временное значение - PullRequest
64 голосов
/ 17 июня 2011

Проблемы при сохранении родительского / дочернего объекта в спящем режиме.Любая идея будет высоко оценена.

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

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

Ответы [ 7 ]

73 голосов
/ 30 марта 2012

для подписчиков, это сообщение об ошибке также может означать «у вас есть ссылка на сторонний объект, который еще не был сохранен в БД» (даже если он существует и не является нулевым).

39 голосов
/ 17 июня 2011

К каждому InvoiceItem должен быть присоединен Invoice из-за not-null="true" в сопоставлении много-к-одному .

Итак, основная идея заключается в том, что вам нужно установить эти явные отношения в коде.Есть много способов сделать это.В вашем классе я вижу setItems метод.Я не вижу addInvoiceItem метод.Когда вы устанавливаете предметы, вам нужно пройтись по набору и вызвать item.setInvoice(this) для всех предметов.Если вы реализуете метод addItem, вам нужно сделать то же самое.Или же вы должны установить Счет-фактуру для каждого InvoiceItem в коллекции.

4 голосов
/ 25 июня 2015

Это может быть просто:

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

но при сохранении значение «Some_Column» равно нулю, даже если «Some_Column» не может быть первичным или внешним ключом.

2 голосов
/ 08 июня 2013

Проверьте несохраненные значения для вашего первичного ключа / идентификатора объекта в ваших файлах hbm. Если у вас есть автоматическое создание идентификатора с помощью Hibernate Framework, и вы устанавливаете идентификатор где-то, он выдаст эту ошибку. По умолчанию несохраненное значение равно 0, поэтому, если вы установите идентификатор в 0, вы увидите эту ошибку.

0 голосов
/ 13 сентября 2018

Я решил удалить свойство @Basic (необязательно = false) или же просто обновите логическое значение @Basic (необязательно = true)

0 голосов
/ 12 мая 2016

Сделайте эту переменную переходной. Ваша проблема будет решена ..

@Column(name="emp_name", nullable=false, length=30)
    private transient String empName;
0 голосов
/ 24 марта 2015

Я получил ту же ошибку, но в конце концов решил ее, на самом деле я не устанавливал объект Object, который уже был сохранен для другого объекта, и, следовательно, значение объекта, которое он получал для ключа foreeign, было нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...