2013-08-16 45 views
2

下面是代码:对象引用一个未保存的瞬态的实例 - 弹簧,JPA休眠

@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是一个静态表。这里是个例外:

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

回答

1

您应该为多对一设置一个cascade = "save-update "

相关问题