简体   繁体   中英

Object references an unsaved transient instance save the transient instance before flushing error

object references an unsaved transient instance - save the transient instance before flushing.

I have a 2 classes OrganizationEntity and ApplicationEntity. Organizations and applications has many to many relationship.

OrganizationEntity has

@ManyToMany(cascade = { CascadeType.PERSIST })
@JoinTable(
    name = "APP_ORG_REF",
    joinColumns = { @JoinColumn(referencedColumnName = "id") },
    inverseJoinColumns = { @JoinColumn(referencedColumnName = "id") })
private Set<ApplicationEntity> applications;

ApplicationEntity has

/**
 * 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);
}

My question is if i save applicationEntity using applicationRepository.save(applicationEntity) will it save organiation also as i have CASCADETYPE.ALL defined over the field. I am getting this error.

Caused by: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing

You are fetching the application information from DB.

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

you are using that for Organization. So I could suggest to use @Transactional annotation on the method createOrganizationEntity .

if not resolve please share the complete entity classes as well for better understanding.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM