对象引用未保存的瞬态实例 在刷新错误之前保存瞬态实例

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:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例