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