spring - 对象引用未保存的 transient 实例 - Spring、JPA Hibernate

标签 spring hibernate jpa transient

这是代码:

@Entity
public class PortalUser {

    @NotNull
    @OneToMany(mappedBy = "portalUser", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<PortalUserOrganisation> portalUserOrganisations;


    @NotNull
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "portalUser", orphanRemoval = true)
    private Set<UserRole> userRoles = new HashSet<UserRole>();    

}

@Entity
public class PortalUserOrganisation {

    @NotNull
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "USER_ID", referencedColumnName = "ID")
    private PortalUser portalUser;

    @NotNull
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ORGANISATION_ID", referencedColumnName = "ID")
    private Organisation organisation;
}


@Entity
public class Organisation {

    @OneToMany(mappedBy = "organisation", cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    private Set<PortalUserOrganisation> portalUserOrganisations;
}

@Entity
public class UserRole {

    @NotNull
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "USER_ID", referencedColumnName = "ID")
    private PortalUser portalUser;

    @NotNull
    @ManyToOne(fetch = FetchType.LAZY, optional=true)
    @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID")
    private RoleLookup roleLookup;

}


@Entity
public class RoleLookup extends AbstractLookupEntity {

    @OneToMany(mappedBy = "roleLookup", cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    private Set<UserRole> userRoles = new HashSet<UserRole>();

}

Code to Create a User:

@Transactional
saveUser(userObj)
PortalUser portalUser = new PortalUser;
portalUser.setStatus(status);
PortalUserOrganisation userOrganisation = null;
for (OrganisationsDto dto : organisationsList()) {
    userOrganisation = new PortalUserOrganisation();
    userOrganisation.setOrganisation(organisationRepository.findOne(dto.getId()));
    userOrganisation.setPortalUser(portalUser);
    userOrganisation.setCreatedUpdatedBy(context.getName());
    userOrganisation.setCreatedUpdatedDate(createUpdateDate);
    userOrganisation.setAction(portalUser.getAction());
    userOrganisation.setStatus(portalUser.getStatus());
    userOrganisation.setActive(true);
    portalUser.getPortalUserOrganisation().add(userOrganisation);
}

UserRole userRole = null;
for (RoleLookupDto dto : portalUserDto.getUserRoles()) {
    userRole = new UserRole();
    userRole.setPortalUser(portalUser);
    userRole.setRoleLookup(roleLookupRepository.findOne(dto.getId()));
    userRole.setCreatedUpdatedBy(context.getName());
    userRole.setCreatedUpdatedDate(createUpdateDate);
    userRole.setAction(portalUser.getAction());
    userRole.setStatus(portalUser.getStatus());
    userRole.setActive(true);
    portalUser.getUserRole().add(userRole);
}

portalUser.setActive(false);
portalUser = portalUserRepository.save(portalUser);
return portalUser;

我看过很多帖子,但这并没有解决我的问题。任何帮助表示赞赏。这里的 RoleLookup 是一个静态表。这是异常(exception):

org.hibernate.TransientObjectException:对象引用未保存的 transient 实例 - 在刷新之前保存 transient 实例:com.commerzbank.clearing.ccp.domain.UserRole.roleLookup -> com.commerzbank.clearing.ccp.domain.RoleLookup;嵌套异常是 java.lang.IllegalStateException:org.hibernate.TransientObjectException:对象引用未保存的 transient 实例 - 在刷新之前保存 transient 实例:com.commerzbank.clearing.ccp.domain.UserRole.roleLookup -> com.commerzbank.clearing。 ccp.domain.RoleLookup

最佳答案

你应该设置一个 cascade = "save-update "对于多对一。

关于spring - 对象引用未保存的 transient 实例 - Spring、JPA Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18277986/

相关文章:

java - 使用 JPA 创建树

java - ClassCastException:RestTemplate 返回 List<LinkedHashMap> 而不是 List<MymodelClass>

java - tomcat 中的 PersistenceException(没有 EntityManager 的持久性提供程序)

java - 如何获取属于一项调查的所有问题?

java - 如何使用 Querydsl 更新 JPA 实体?

java - hibernate 查询异常 : could not resolve property in spring petclinic sample application

java - Controller 中扩展抽象 Controller 的方法的自定义注释

java - 我应该使用 HttpURLConnection 还是 RestTemplate

java - Spring @Transaction(readOnly = true) 传播到线程

java - Hibernate提供了多少种访问数据库的方式?