If you encountered problem when try to insert object with pre-assigned Id into Oracle Database in JRuby 1.0.1 with ActiveRecord-JDBC 0.5, here is quick fix
module ::JdbcSpec
module Oracle
def insert(sql, name = nil, pk = nil, id_value =nil, sequence_name = nil) #:nodoc:
if pk.nil? || id_value
execute sql, name
else # Assume the sql contains a bind-variable for the id
id_value = select_one(
"select #{sequence_name}.nextval id from dual")['id'].to_i
log(sql, name) {
@connection.execute_id_insert(sql,id_value)
}
end
id_value
end
end
end
The problem is on compatibility of Oracle JDBC driver and
execute_insert
method of java class
JdbcAdapterInternalService
. The fix simply remove the usage of
execute_insert
method. Verification code is below
require 'rubygems'
gem 'ActiveRecord-JDBC','0.5'
require 'jdbc_adapter'
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => 'jdbc',
:driver => 'oracle.jdbc.driver.OracleDriver',
:url => 'jdbc:oracle:thin:@localhost:1521:DEV',
:username => "scott",
:password => "tiger",
)
class Emp < ActiveRecord::Base
set_table_name 'emp'
set_primary_key 'empno'
end
emp = Emp.new
emp.id = 9999
emp.save
No comments:
Post a Comment