1

ロール (既存の) ロールを持つユーザー オブジェクトを挿入しています。user_role.idに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);
}
4

1 に答える 1

1

user_role結合テーブルには、Hibernateidが知らない列があります。hibernate が知っているのは、列role_iduser_id列だけです。このid列は役に立たないので、user_roleテーブルから削除する必要があります。そこに残す場合は、null 可能にするか、デフォルト値を持たせる必要があります。

于 2013-01-25T09:19:08.607 に答える