свойство not-null ссылается на нулевое или переходное значение



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



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


счет-фактура.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;
}
}
1115   7  

7 ответов:

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

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

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

Это может быть как простой, как:

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

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

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

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

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

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

@Column(name="emp_name", nullable=false, length=30)
    private transient String empName;

Comments

    Ничего не найдено.