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

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    您正在从 DB 中获取 application 信息。

    final ApplicationEntity applicationEntity =
        applicationRepository.findByName(app, service);
    

    您将其用于组织。所以我可以建议在方法createOrganizationEntity上使用@Transactional注解。

    如果不能解决,请分享完整的实体类以便更好地理解。

    【讨论】:

    • 不,@Transactional 不能解决问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2015-09-27
    • 2021-03-03
    • 2013-11-30
    • 2017-04-12
    • 1970-01-01
    相关资源
    最近更新 更多