web-dev-qa-db-fra.com

la propriété not-null fait référence à une valeur null ou transitoire

Problèmes rencontrés lors de la sauvegarde d'un objet parent/enfant avec la veille prolongée Toute 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)

mappage en veille prolongée:

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

Facture.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

Une InvoiceItem doit être associée à chaque Invoice en raison du not-null="true" dans le mappage many-to-one

L'idée de base est donc de définir cette relation explicite dans le code. Il y a plusieurs façons de le faire. Sur votre classe, je vois une méthode setItems. Je ne vois pas une méthode addInvoiceItem. Lorsque vous définissez des éléments, vous devez parcourir l'ensemble et appeler item.setInvoice(this) sur tous les éléments. Si vous implémentez une méthode addItem, vous devez faire la même chose. Sinon, vous devez également définir la facture de chaque InvoiceItem de la collection.

36
hvgotcodes

pour les abonnés, ce message d'erreur peut également signifier "vous l'avez référencé à un objet étranger qui n'a pas encore été enregistré dans la base de données" (même s'il est présent et qu'il n'est pas null).

70
rogerdpack

Cela pourrait être aussi simple que:

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

mais en persistant, la valeur de "Some_Column" est nulle même si "Some_Column" peut ne pas être une clé primaire ou étrangère.

3
Sandeep Jindal

Vérifiez les valeurs non enregistrées de votre clé primaire/ID d'objet dans vos fichiers hbm. Si vous avez créé automatiquement un identifiant par hibernate framework et que vous le définissez quelque part, cette erreur générera cette erreur. Par défaut, la valeur non sauvegardée est 0, donc si vous définissez l'ID sur 0, vous verrez cette erreur.

2
Rohitdev

J'ai résolu le problème en supprimant la propriété @Basic (optional = false)

0

J'obtenais la même erreur mais je l'ai finalement résolue, en fait je ne définissais pas l'entité d'objet qui est déjà enregistrée dans l'autre entité et par conséquent la valeur de l'objet qu'elle obtenait pour la clé étrangère était nulle.

0
Pratswinz