Hibernate 休眠保存子实体而不插入父实体

Hibernate 休眠保存子实体而不插入父实体,hibernate,spring-mvc,Hibernate,Spring Mvc,我想插入一个新的子记录,其中数据库中已经存在父关系,而不必首先通过查询获取父记录,然后插入新的子记录 示例:我有一个产品实体,它有一个多功能实体和一个现有目录实体: @NotNull @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "catalog_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "FK_product_catalog")) pri

我想插入一个新的子记录,其中数据库中已经存在父关系,而不必首先通过查询获取父记录,然后插入新的子记录

示例:我有一个产品实体,它有一个多功能实体和一个现有目录实体:

@NotNull
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "catalog_id",
  referencedColumnName = "id", foreignKey = @ForeignKey(name = "FK_product_catalog"))
private Catalog catalog;
我希望能够在目录中插入新产品,而不必首先查询目录来填充新产品实体

事实上,我在restController的帖子中收到了一个json,json包含产品属性和目录id

以下是Json:

{
  "id":1,
  "attribute1":"value",
  "catalog":{"id":1}
}
一旦发生序列化,产品实例将正确形成,其中包含仅具有id字段值的Catalog实例

我在插入时收到此消息:

试图保存一个或多个具有不可为空的 与未保存的临时实体的关联

我理解为什么我会收到此消息,我也可以从数据库中获取目录行,但这意味着每次插入子行时我都必须查询所有父行,这在设计上毫无意义,因为我实际上只是插入一个带有外键引用的行


有人知道如何防止这种行为吗?

为什么不为catalog\u id创建一个单独的属性,并将@NotNull约束放在那里,而不是catalog object属性?

我最初希望由hibernate生成数据库ddl,但我仍在尝试这样做。当我从数据库中选择一个产品时,我也希望该目录是即时获取的。但是如果我插入一个产品,我只想在产品行中插入catalogId,而不需要对目录部分执行额外的选择。对我来说,这似乎是一个非常标准的功能。我想在select上立即获取,但我只想插入产品实体,如果目录不存在,让数据库强制执行外键约束。我尝试了您的建议,它解决了问题。通过保持与Catalog的ManyToOne关系(insert和update=false)并添加Catalog\u id字段,我现在可以通过仅具有父关系的id来仅插入产品实体。尽管如此,在实体中存在重复项(同时具有catalog.id和catalod_id字段)从长远来看可能会导致问题,但这比在插入上执行多个无用的选择要好。