2013-08-16 55 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 "

相關問題