非空属性引用空值或瞬时值

在冬眠过程中面临解救父母/孩子物体的困难,如有任何意见将会被高度赞赏。

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

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;
}
}
251287 次浏览

由于 多对一映射中的 not-null="true",每个 InvoiceItem必须有一个 Invoice连接到它。

所以基本的想法是,你需要在代码中建立明确的关系。有很多方法可以做到这一点。在您的类中,我看到一个 setItems方法。我没有看到一个 addInvoiceItem方法。在设置项目时,需要循环访问这个集合,并对所有项目调用 item.setInvoice(this)。如果实现 addItem方法,则需要执行相同的操作。或者您需要以其他方式设置集合中每个 InvoiceItem的发票。

对于跟随者,这个错误消息也可能意味着“您让它引用一个尚未保存到 DB 的外部对象”(即使它存在,并且非 null)。

检查 hbm 文件中主键/对象 ID 的未保存值。如果您已经通过 hibernate 框架自动创建了 ID,并且您正在将 ID 设置到某个位置,那么它将抛出这个错误。默认情况下,未保存的值为0,所以如果您将 ID 设置为0,您将看到这个错误。

我得到了相同的错误,但最终解决了它,实际上我没有设置的对象实体,这是已经保存到其他实体,因此对象值,它得到的外键为空。

这可能很简单:

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

但在保持时,“ Some _ Column”的值为空,即使“ Some _ Column”可能不是任何主键或外键。

I resolved by removing @Basic(optional = false) property or 只需更新 boolean@Basic (可选 = true)

cascade = CascadeType.PERSIST

我觉得会有帮助。

我的情况下,我有 _ menu 表。_ manu 用于存储仪表板菜单,其中包含 menu _ father。所以这个关系就是它自己。

假设我们有 _ menu:

Id Name             menu_parent
1  User Management  null

because 用户管理's menu_parent is null, it is called parent menu. Let make the child menu:

Id Name             menu_parent
2  User Edit        1
3  User Other       1

User Edit and 其他使用者 are the children of Menu Management. 因此,这种关系是多对一的。

这是我们的老规矩:

@NotFound(action = NotFoundAction.IGNORE)
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "menu_parent", nullable = true)
private Menu menuParent;

你看,它使用了 OneToOne,甚至是 nullable = true。 错误是:

not-null property references a null or transient value: com.va.core.entity.role.Menu.menuParent; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: com.va.core.entity.role.Menu.menuParent

我的解决方案是改变与 ManyToOne 的关系如下:

@NotFound(action = NotFoundAction.IGNORE)
@ManyToOne(fetch = FetchType.LAZY, optional = true)
@JoinColumn(name = "menu_parent", nullable = true)
private Menu menuParent;

在主类中添加@EnableJpaAuditing 注释

.DataIntegrityViolationException: not-null property references a null or transient value : com.graphql.graphql.entity

我得到了这个错误,在 Graphql 与弹簧启动

the problem I was add new row to database table class but I forget to set the values for the columns

这是实体类(数据库表)中的错误函数

public Dog(String name, String modal, String breed) {
}

Name 和 mode 不为 null,所以当它返回 newDog 类时会出现这个错误,因为我没有保存这些值,所以除了 name (非 null 列)中的值之外,所有的值都为 null,mode 中的值为 name,所以我像在实体表类中那样解决了这个问题

    public Dog(String name, String modal, String breed) {
this.name = name;
this.modal = modal;
this.breed = breed;
}

我还忘记在 Dog 表中添加 setter 和 getter,并添加它们

所以这个标志意味着返回的类对于不接受 null 或(在我的例子中所有返回的列都是 null,当 addNewDog时所有值都是 null)的列具有 null 值

当前两列是 nullable=false时,java 看到了什么

    class Dog{
# not null column
String name = null;
      

# not null column
String modal = null;


String breed = null;
}

现在返回的 newDog 类具有不接受 null 的列的值,并且问题已经解决

请注意这个解决方案来描述和解决错误消息本身

当我在 SpringBoot 中错误地引用 SQL 列标题而不是代码中的实体属性时,我得到了这个错误。

@Column(name = "first_name", nullable = false)
private String firstName;

在提出请求时,请将其称为 firstName

For me the error occured because I did not set correctly the One-to-Many relation of the newly created objects.

For example saving a new school with lots of students in it: School -> Student

SchoolEntity school = new SchoolEntity();


List<Students> studens = new ArrayList<>();
Student a = new Student();
Student b = new Student();


students.forEach(e -> e.setSchool(school)); // missing this step will cause the error
school.setStudents(students);
schoolRepository.save(school);