Problem with has_and_belongs_to_many

Hello I have two models:
app/model/user.rb
class User < ActiveRecord::Base
  has_and_belongs_to_many :roles
end
app/model/role.rb
class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
end
And one controller:
class Admin::UsersController < ApplicationController
  # ...
  def user_save usr, id = nil
    roles = []
    usr[:roles].each_key do |role|
      roles << Role.find(:first, :conditions => {:id => role})
    end
    if id.nil?
      user = User.new :first_name => usr[:first_name],
                      :last_name => usr[:last_name]
    else
      user = User.find :first, :conditions => {:id => id}
      user.first_name = usr[:first_name]
      user.last_name = usr[:last_name]
    end
    user.save
    user.roles = roles
    user.save
  end
  
  private :user_save
end

% sqlite db/library_development.db
SQLite version 2.8.16
Enter ".help" for instructions

SELECT * FROM roles_users;

1|1|1

.schema roles_users

CREATE TABLE roles_users ("id" INTEGER PRIMARY KEY NOT NULL, "role_id"
integer DEFAULT NULL, "user_id" integer DEFAULT NULL, FOREIGN KEY
(role_id) REFERENCES roles (id), FOREIGN KEY (user_id) REFERENCES users
(id));

.quit

From log:
  Role Load (0.000510) SELECT * FROM roles WHERE (roles."id" = '1')
LIMIT 1
  User Load (0.000711) SELECT * FROM users WHERE (users."id" = '2')
LIMIT 1
  SQL (0.000675) PRAGMA table_info(users)
  User Indexes (0.000181) PRAGMA index_list(users)
  User Update (0.058220) UPDATE users SET "last_name" = 'xxxx', "first_n
ame" = 'yyyy' WHERE "id" = 2
  SQL (0.000738) PRAGMA table_info(roles_users)
  Role Load (0.000789) SELECT * FROM roles INNER JOIN roles_users ON
roles.id
= roles_users.role_id WHERE (roles_users.user_id = 2 )
  SQL (0.000580) PRAGMA table_info(roles)
  Role Indexes (0.000221) PRAGMA index_list(roles)
  SQL (0.000629) PRAGMA table_info(roles_users)
  SQL (0.000000) SQLite::Exceptions::SQLException: PRIMARY KEY must be
unique:
INSERT INTO roles_users ("role_id", "id", "user_id") VALUES (1, 1, 2)

What can be wrong? Why it inserts it owns id?