2014-12-12 2 views
2

Я получаю NPB MyBatis, когда пытаюсь вставить запись с нулевым первичным ключом, а затем вернуть значение значения ключа (триггер oracle задает ключ). ИнтерфейсMyBatis nullPointerException при вводе null

FooMapper:

... 
public void insertFooObject (final Foo foo); 
... 

FooMapper.xml:

... 
    <insert id="insertFooObject" useGeneratedKeys="true" keyColumn="foo_id" keyProperty="fooId"> 
     insert into foos (foo_id, gcor_id, registration_date) 
     values (#{fooId, jdbcType=NUMERIC}, #{gcorId, jdbcType=NUMERIC}, #{registrationDate, jdbcType=DATE}) 
    </insert> 
... 

Вот модель:

public class Foo { 
    private final Integer fooId; 
    private final Integer gcorId; 
    private final Date registrationDate; 

    public Foo(final Integer fooId, final Integer gcorId, final Date registrationDate)  { 
     this.fooId = fooId; 
     this.gcorId = gcorId; 
     this.registrationDate = registrationDate; 
    } 
... 

И вот звонок:

... 
Foo foo = new Foo(null, 229, null); 
fooMapper.insertFooObject(foo); 
... 

fooMapper вводится пружиной и может быть успешно использован для других операторов SQL. Когда я передаю число для fooId и registrationDate имеет значение null, все работает. Когда fooId равна нулю (как показано на рисунке), я получаю ошибку:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
Error updating database. Cause: java.lang.NullPointerException 
The error may involve defaultParameterMap 
The error occurred while setting parameters 
SQL: insert into foos (foo_id, gcor_id, registration_date)   values (?, ?, ?) 
Cause: java.lang.NullPointerException 

Вот мой конфигурационный файл:

<?xml version="1.0" encoding="UTF-8"?> 
<beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/util 
     http://www.springframework.org/schema/util/spring-util-3.0.xsd 
    "> 

    <bean id="datasource" class="org.apache.ibatis.datasource.pooled.PooledDataSource"> 
     <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>   
     <property name="url" value="jdbc:oracle:thin:@......"/> 
     <property name="username" value="..."/> 
     <property name="password" value="..."/> 
    </bean> 

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
     <property name="dataSource" ref="datasource"/> 
    </bean> 

    <bean id="fooMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> 
     <property name="mapperInterface" value="com.foo.FooMapper" /> 
     <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="datasource" /> 
    </bean> 
</beans> 

Любые идеи, как это исправить? Мне не повезло с поиском в googling, и я подумал, что все будет в порядке, указав jdbcType. Благодаря!

+1

можно ли увидеть файл конфигурации mybatis? –

+0

уверен, добавлен файл конфигурации – rimsky

ответ

0

Я нашел проблему в классе модели (Foo.java):

public int getFooId() { 
    return fooId; 
} 

fooId представляет собой целое число, а не инт. Изменив возвращаемый тип getter на Integer, я смог вставить нулевой первичный ключ и получить возвращаемый триггер идентификатор последовательности.

+0

Это именно то, что проблема. – Kong

1

Я считаю, что вы используете useGeneratedkeys для оракула, оракула которого не supprot. GeneratedKeys поддерживаются mysql и postgress, я считаю. Вместо этого используйте selectkeys для получения следующего значения или, как вы в порядке, чтобы передать значение null для fooId, удалить useGeneratedKeys, который по умолчанию равен false. Вы можете получить следующее значение с помощью последовательности

<selectKey keyProperty="fooId" 
      resultClass="int"> 
    SELECT nextVal('foo_id_seq') 
</selectKey> 
+0

Этот пост предполагает, что это возможно: http://stackoverflow.com/questions/15234718/how-to-obtain-last-insert-id-in-oracle-using-mybatis – rimsky

+0

Кроме того, даже когда Я удаляю эту часть, поэтому я просто ..., я получаю ту же ошибку – rimsky

+0

Я должен добавить, что когда я передаю отдельные поля вместо объекта, я не получаю ошибку: < вставить ID = "insertFoo"> вставки в Фоос (foo_id, gcor_id, REGISTRATION_DATE) значения (# {fooId, jdbcType = NUMERIC} # {gcorId} # {registrationDate, jdbcType = DATE}) – rimsky

Смежные вопросы