non-null références de propriété a la valeur null ou transitoire de la valeur
Face à des problèmes dans le sauvetage de l'enfant et le parent de l'objet avec la veille prolongée. Une idée serait très appréciée.
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;
}
}
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;
}
}
Vous devez vous connecter pour publier un commentaire.
Chaque
InvoiceItem
doit avoir unInvoice
attaché à elle en raison de lanot-null="true"
dans le plusieurs-à-un de cartographie.Donc l'idée de base est que vous devez mettre en place que la relation explicite dans le code. Il y a beaucoup de façons de le faire. Sur votre classe, je vois un
setItems
méthode. Je ne vois PAS unaddInvoiceItem
méthode. Lorsque vous définissez les éléments, vous avez besoin d'une boucle sur le définir et appeleritem.setInvoice(this)
sur tous les éléments. Si vous implémentez unaddItem
méthode, vous devez faire la même chose. Ou vous avez besoin d'sinon la Facture de chaqueInvoiceItem
dans la collection.pour les adeptes, ce message d'erreur peut aussi signifier "vous avez le référencement d'un objet étranger qui n'a pas été enregistré dans la bd encore" (même si elle est là, et est non nul).
Cela pourrait être aussi simple que:
mais alors que la persistance, la valeur de "Some_Column"est nulle, même si "Some_Column" ne peut pas être primaire ou une clé étrangère.
Vérifier la non enregistrées des valeurs de clé primaire/ID de l'Objet dans vos fichiers hbm. Si vous avez automatisé de l'ID de la création par le framework hibernate et que vous définissez l'ID quelque part qu'il va jeter ce error.By par défaut les non sauvés de la valeur est de 0, donc si vous définissez l'ID à 0, vous obtiendrez cette erreur.
J'avais la même erreur, mais résolu enfin,en fait je n'étais pas de définir l'Objet de l'Entité qui est déjà enregistré sur l'autre entité et par conséquent la valeur de l'Objet qu'il a trouvé pour foreeign clé est nulle.
Je l'ai résolu en supprimant @de Base(en option = false) propriété
ou
juste mettre à jour boolean @de Base(en option = true)
Faire de cette variable comme transitoire.Votre problème résolu..