当前位置: 首页 > 面试题库 >

not-null属性引用一个null或瞬态值

周正真
2023-03-14
问题内容

在使用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映射:

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

问题答案:

由于在 多对一 映射中,每个对象都InvoiceItem必须具有Invoice附件。 not-null="true" __

因此,基本思想是您需要在代码中建立该显式关系。有很多方法可以做到这一点。在您的课堂上,我看到了一个setItems方法。我看不到addInvoiceItem方法。设置项目时,需要遍历设置并调用item.setInvoice(this)所有项目。如果实现addItem方法,则需要执行相同的操作。或者,您需要另外设置集合中每个发票InvoiceItem



 类似资料:
  • 我正在使用spring boot 2.0.6和hibernate 5.2.17的web服务。当我用@CreationTimestamp、@Column(nullable=false)和@Temporal(TemporalType.TIMESTAMP)的createTime字段保存对象时,我得到了异常组织。冬眠PropertyValueException:not null属性引用null或瞬态值:c

  • 错误是: 引用表实体 有谁能给我出问题的地方提供解决方案吗?

  • 我对Hibernate有一个问题:我有两个实体Libro和ediative,它们具有多对一的关系。当我尝试持久化时,会出现以下错误: Hibernate:选择编辑。ID_Editical,Editical_。NOMBRE as NOMBRE4_u,editorial_u。ID\u目录为ID3\u 4\u,editorial\u。NIF作为NIF4_来自Editory Editory_ where

  • NULL 值代表遗漏的未知数据。 默认地,表的列可以存放 NULL 值。 本章讲解 IS NULL 和 IS NOT NULL 操作符。 SQL NULL 值 如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。 NULL 值的处理方式与其他值不同。 NULL 用作未知的或不适用的值的占位符。 注释:无法比较 NULL 和

  • 问题内容: 我写了两种方法检查那里的表现 并在编译后检查它的字节码 在这里,两个操作码用于实现if条件:在第一种情况下,它使用ifnull-检查栈顶值是否为null-;在第二种情况下,它使用if_acmpeq- 检查栈顶值是否相等- 那么,这会对性能产生影响吗?(这将帮助我证明null的第一个实现在性能方面以及可读性方面都不错:)) 问题答案: 比较生成的字节码几乎没有意义,因为大多数优化是在运行

  • 主要内容:示例默认情况下,表的字段可以包含 NULL 值,如果您不希望某个字段出现 NULL 值,那么可以在该字段上添加 NOT NULL 约束(非空约束),此时就必须给该字段指定一个具体的值,不能留空。 注意,NULL 不等于没有数据,而是表示数据是未知的。 示例 下面的 SQL 语句将创建一个名为 website 的新表,该表包含七个字段,其中五个字段不接受 NULL 值,它们分别是 id、name、age