# MyBatis - Update Problem



## JayGabriel (11. Okt 2011)

Hallo,

ich hoff, hier kann mir jemand helfen:

Ich bin noch dabei mich in MyBatis einzuarbeiten und versuche gerade einfache SELECT und UPDATE Statements auszuführen. Das Select an sich klappt wunderbar, nur das UPDATE wirft mir ständig Exceptions um die Ohren.


```
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: java.sql.DataTruncation: Data truncation
### The error may involve de.webservice.dbtest.data.UserMapper.setUserData-Inline
### The error occurred while setting parameters
### Cause: java.sql.DataTruncation: Data truncation
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:123)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:38)
	at $Proxy1.setUserData(Unknown Source)
	at de.webservice.dbtest.connector.MyBatisTest.updateUser(MyBatisTest.java:86)
	at de.webservice.dbtest.connector.MyBatisTest.main(MyBatisTest.java:111)
Caused by: java.sql.DataTruncation: Data truncation
	at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:382)
	at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820)
	at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258)
	at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:632)
	at net.sourceforge.jtds.jdbc.JtdsStatement.processResults(JtdsStatement.java:584)
	at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQL(JtdsStatement.java:546)
	at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.execute(JtdsPreparedStatement.java:558)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:22)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:51)
	at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:29)
	at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:88)
	at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:43)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:121)
	... 5 more
```

Meine Userklasse hat die Elemente, die einzig und allein geupdatetet werden können (in der DB gibts mehr Spalten).

Mein Vorgehen:
- erst hole ich mir den User in meinen User Datentyp (Name, Nachname, ID und Adresse).
- dann änder ich in dem gerade gefüllten Objekt den Nachnamen und wollte dann damit ein UPDATE machen.
- Daraufhin kommt jedoch die Exception.

Kennt jemand von euch diese Fehlermeldung und kann mir dabei helfen?

Configurationen:
[XML]
<typeAliases>
  <typeAlias alias="User" type="de.webservice.dbtest.model.User"/>
</typeAliases>

<environments default="development">
	...
</environments>

<mappers>
  <mapper resource="de/webservice/dbtest/data/UserMapper.xml"/>
</mappers>
[/XML]

Mapper xml:
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="de.webservice.dbtest.data.UserMapper">

    <resultMap id="result" type="User">
        <result property="id" column="CLIENTNO"/>
        <result property="startdate" column="STARTDATE"/>
        <result property="enddate" column="ENDDATE"/>
        <result property="firstname" column="FIRSTNAME"/>
        <result property="name" column="NAME"/>
        <result property="street" column="STREET"/>
        <result property="houseno" column="HOUSENO"/>
        <result property="zipcode" column="ZIPCODE"/>
        <result property="city" column="CITY"/>
    </resultMap>

    <select id="getUser4Id" parameterType="long" resultMap="result">
        SELECT CLIENTNO, STARTDATE, ENDDATE, FIRSTNAME, NAME, STREET, HOUSENO, ZIPCODE, CITY
				FROM ADDRESS adr
				WHERE CLIENTNO = #{id}
    </select>

    <update id="setUserData" parameterType="User">
			UPDATE ADDRESS
    	SET SURNAME =  #{name}
      WHERE CLIENTNO = #{id}
      AND GETDATE() BETWEEN STARTDATE AND ENDDATE
		</update>

</mapper>
[/XML]

Mapper Java

```
package de.webservice.dbtest.data;

import java.util.List;

import de.webservice.dbtest.model.User;

public interface UserMapper {
	List<User> getUser4Id(long customerid);
	
	void setUserData(User user);
}
```

User Klasse

```
package de.webservice.dbtest.model;

import java.sql.Date;

public class User {
  private String id;
  private long startdate;
  private long enddate;
  private String firstname;
  private String name;
  private String street;
  private String houseno;
  private String zipcode;
  private String city;

  /**
   * Getter und Setter Block
   */
  [...]
```

Habe ich irgendwie etwas vergessen? Oder fällt euch ein Fehler auf?
Ich arbeite mit MyBatis 3.0.5 und einer MSSQL DB.

Grüße,
Jay


----------



## Marcinek (11. Okt 2011)

DataTruncation (Java Platform SE 6)

Sind die Daten so, dass sie in die Spalten passen, ohne sie zu überschreiten?

SURNAME z.B. ist nicht gemappt.


----------



## maki (11. Okt 2011)

der neue Nachnahme ist wohl länger als was das SQL Feld aufnehmen darf.


----------



## JayGabriel (11. Okt 2011)

Oh!

Danke für die Hilfe, DAS war der Fehler!
Ich frag mich, warum der Zweitname nur 5 Zeichen beinhalten darf, aber gut...

Vielen Dank, für die schnelle Hilfe! 

Gruß,
Jay


----------



## maki (11. Okt 2011)

> Ich frag mich, warum der Zweitname nur 5 Zeichen beinhalten darf, aber gut...


Weil es wohl so im Db Schema angegeben ist (was du nicht gepostet hattest)


----------

