Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何在不更新现有实体的情况下创建新实体和现有实体之间的关系?_Spring_Hibernate_Jpa - Fatal编程技术网

Spring 如何在不更新现有实体的情况下创建新实体和现有实体之间的关系?

Spring 如何在不更新现有实体的情况下创建新实体和现有实体之间的关系?,spring,hibernate,jpa,Spring,Hibernate,Jpa,我有一个电话实体和一个电话类型实体。每个电话有一个电话类型,每个电话类型可以有多个电话 我想在使用现有电话类型时添加新电话,但在创建新电话时,如何创建与现有电话类型的关系,而不从数据库检索电话类型,也不更新现有电话类型 我试着用现有ID创建一个新的PhoneType,然后尝试更新PhoneType记录。我不希望发生此更新 我还尝试在Phone的PhoneType字段中更改CascadeType,但我很难理解这些不同类型的功能 在电话实体中: @ManyToOne(cascade=CascadeT

我有一个电话实体和一个电话类型实体。每个电话有一个电话类型,每个电话类型可以有多个电话

我想在使用现有电话类型时添加新电话,但在创建新电话时,如何创建与现有电话类型的关系,而不从数据库检索电话类型,也不更新现有电话类型

我试着用现有ID创建一个新的PhoneType,然后尝试更新PhoneType记录。我不希望发生此更新

我还尝试在Phone的PhoneType字段中更改CascadeType,但我很难理解这些不同类型的功能

在电话实体中:

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name=“phone\u type\u id”,referencedColumnName=“id”)
私人电话类型;
和PhoneType实体:

@Getter
@塞特
@EqualsAndHashCode
@实体
@表(name=“电话类型”)
公共类电话类型{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私人长id;
@列(name=“description”,长度=175,可空=false)
私有字符串描述;
@列(name=“name”,长度=175,可空=false)
私有字符串名称;
}
最后,创建实体/关系:

返回新手机()
.setNumber(电话号码)
.setPhoneType(新PhoneType().setId(defaultPhoneTypeId))
}
在本例中发生的情况正是您所期望的,hibernate尝试使用一组空字段更新PhoneType,其中PhoneType id=defaultPhoneTypeId

使用CascadeType.MERGE,我得到以下错误:

java.lang.IllegalStateException:org.hibernate.TransientPropertyValueException:对象引用未保存的临时实例-在刷新之前保存临时实例:com.phoneType->com.phoneType

虽然这是预期的,但我不知道如何与1个新实体和1个预先存在的实体创建关系。

您已将级联类型指定为
CascadeType。ALL
这会将所有操作级联到映射实体。 因此,在保存电话时,您正在级联保存操作,并要求ORM保存电话类型

尝试将其完全移除。默认级联类型级联无操作

    @ManyToOne
    @JoinColumn(name = "phone_type_id", referencedColumnName = "id")
    private PhoneType phoneType;

创建phone对象时,您可以从DB中按Id获取phoneType,然后在保存之前将其设置在您的phone对象中。

您可以保留对现有的
phoneType
的引用并重新使用它,或者从DB中按Id获取
phoneType
。此外,您还可以阅读Vlad Mihalcea在上的帖子。