Probleme beim Speichern des übergeordneten / untergeordneten Objekts im 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)
Zuordnung im Ruhezustand:
<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;
}
}
Dies kann so einfach sein wie:
@Column(name = "Some_Column", nullable = false)
Der Wert von "Some_Column" ist jedoch weiterhin gültig, auch wenn "Some_Column" möglicherweise kein Primär- oder Fremdschlüssel ist.
quelle
Ü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 durch das Hibernate-Framework automatisiert haben und die ID irgendwo festlegen, wird dieser Fehler ausgegeben. Standardmäßig ist der nicht gespeicherte Wert 0. Wenn Sie also die ID auf 0 setzen, wird dieser Fehler angezeigt.
quelle
Ich habe den gleichen Fehler erhalten, ihn aber endgültig behoben. Eigentlich habe ich die Objektentität, die bereits in der anderen Entität gespeichert ist, nicht festgelegt, und daher war der Objektwert, den sie für den Vorgängerschlüssel erhielt, null.
quelle
Ich habe das Problem gelöst, indem ich die Eigenschaft @Basic (optional = false) entfernt oder einfach die boolesche Eigenschaft @Basic (optional = true) aktualisiert habe.
quelle
Machen Sie diese Variable als vorübergehend. Ihr Problem wird gelöst.
@Column(name="emp_name", nullable=false, length=30) private transient String empName;
quelle