2013-08-16 9 views
2

여기에 코드입니다 :객체 참조 저장되지 않은 transient 인스턴스 봄, 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

many-to-one 용으로 cascade = "save-update "을 설정해야합니다.