2013-01-25 4 views
0

역할 (기존) 역할이있는 사용자 개체가 삽입됩니다. 이 user_role.id 나에게없는 삽입 널 (null)을주고있다ORA-01400 : @manytomany unidierctional에 NULL을 삽입 할 수 없습니다.

스키마 : 이제

@Entity 
@Table(name = "user_data") 
public class User extends Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    /** 
    * user can have set of roles profiles 
    */ 
    @ManyToMany(cascade = {CascadeType.ALL} ,fetch=FetchType.EAGER) 
    @JoinTable(name = "user_role", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "role_id", referencedColumnName = "id") }) 
    private Set<Role> roles; 

} 


@Entity @Table(name = "role") 
public class Role extends Serializable { 

    private static final long serialVersionUID = -5954247513572163065L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "name") 
    private String name; 

    @ManyToMany 
    @JoinTable(name = "role_permission", joinColumns = { @JoinColumn(name = "role_id", 
     referencedColumnName = "id") }, 
     inverseJoinColumns = { @JoinColumn(name = "permission_id", 
     referencedColumnName = "id") }) 
    private Set<Permission> permissions; 

    [...] 

}

나는 그것이 나에게 예외 java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("USER_ROLE"."ID")

을주고 사용자를 생성하는 것을 시도하고있다

사용자를 생성하려면 아래와 같이 스프링 저장소 코드를 사용합니다.

@Override 
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 
public User createUser(User user) throws BusinessException { 
    List<Error> errors = new ArrayList<Error>(); 
    validateUserRoles(user ,errors); 
    if (errors.size() > 0) 
    { 
     throw new BusinessException(errors); 
    } 


    user.setUserIdentifier(user.getUserIdentifier().trim()); 
    logger.info("Creating User with username: " + user.getUserIdentifier()); 
    return this.userRepositotry.save(user); 
} 


private void validateUserRoles(User user ,List<Error> errors) { 
    Set<Role> roles = new HashSet<Role>(); 
    if (user.getRoles() != null) 
    { 
     for(Role role : user.getRoles()) 
     { 
      Role r = null; 
      if(role.getId() != null) 
      { 
       r = this.roleRepository.findOne(role.getId()); 
      } else if(role.getName() != null) 
      { 
       r = this.roleRepository.findByName(role.getName()); 
      } 
      if(r == null) 
      { 
       errors.add(new Error(ErrorCode.INVALID_ARGUMENTS,"Invalid user Role.",r)); 
      } else 
      { 
       roles.add(r); 
      } 
     } 
    } 

    user.setRoles(roles); 
} 

답변

0

user_role 조인 테이블은 Hibernate가 알지 못하는 id 컬럼을 가지고있다. 모든 최대 절전 모드는 role_iduser_id 열입니다. id 열은 유용하지 않으므로 user_role 테이블에서 제거해야합니다. 거기에 남겨두면 nullable로 설정하거나 기본값을 갖도록해야합니다.