对象引用未保存的瞬态实例 在刷新错误之前保存瞬态实例
Posted
技术标签:
【中文标题】对象引用未保存的瞬态实例 在刷新错误之前保存瞬态实例【英文标题】:Object references an unsaved transient instance save the transient instance before flushing error 【发布时间】:2021-06-26 04:24:57 【问题描述】:对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例。
我有 2 个类 OrganizationEntity 和 ApplicationEntity。组织和应用程序有多对多的关系。
OrganizationEntity 有
@ManyToMany(cascade = CascadeType.PERSIST )
@JoinTable(
name = "APP_ORG_REF",
joinColumns = @JoinColumn(referencedColumnName = "id") ,
inverseJoinColumns = @JoinColumn(referencedColumnName = "id") )
private Set<ApplicationEntity> applications;
ApplicationEntity 有
/**
* Many to Many Relationship ref with Application.
*/
@ManyToMany(mappedBy = "applications", cascade = CascadeType.ALL)
private Set<OrganizationEntity> organizations;
OrganizationOperationImpl.java
public OrganizationEntity createOrganizationEntity (final String org, final String app,
final String service) throws KMSCommonException
log.debug("Entered createOrganizationEntity");
createValidator(service, app, org, true).verify();
final ApplicationEntity applicationEntity =
applicationRepository.findByName(app, service);
if (applicationEntity == null)
throw new KMSCommonException("Application doesn't exist.");
final OrgKeyRefEntity orgKeyRefEntity = OrgKeyRefEntity.builder().build();
final OrganizationEntity organizationEntity = OrganizationEntity.builder()
.name(org)
.uuid(UUID.randomUUID().toString())
.createdAt(new Timestamp(System.currentTimeMillis()))
.build();
addOrgAppRef(organizationEntity, applicationEntity);
return organizationEntity;
private void addOrgAppRef (final OrganizationEntity org, final ApplicationEntity
applicationEntity)
final Set<ApplicationEntity> applicationEntities = new HashSet<>();
applicationEntities.add(applicationEntity);
org.setApplications(applicationEntities);
final Set<OrganizationEntity> organizationEntities = new HashSet<>();
organizationEntities.add(org);
applicationEntity.setOrganizations(organizationEntities);
applicationRepository.save(applicationEntity);
我的问题是,如果我使用 applicationRepository.save(applicationEntity) 保存 applicationEntity,它也会保存组织,因为我在该字段上定义了 CASCADETYPE.ALL。我收到此错误。
原因:org.hibernate.TransientPropertyValueException:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例
【问题讨论】:
【参考方案1】:您正在从 DB 中获取 application
信息。
final ApplicationEntity applicationEntity =
applicationRepository.findByName(app, service);
您将其用于组织。所以我可以建议在方法createOrganizationEntity
上使用@Transactional
注解。
如果不能解决,请分享完整的实体类以便更好地理解。
【讨论】:
不,@Transactional 不能解决问题以上是关于对象引用未保存的瞬态实例 在刷新错误之前保存瞬态实例的主要内容,如果未能解决你的问题,请参考以下文章
HIbernate - 对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例
TransientObjectException - 对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例
TransientPropertyValueException:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例
数据未保存:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例 [重复]
org.hibernate.TransientObjectException:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例