`

iBatis 中一对多时要注意的问题

阅读更多

出现的问题:

2006-08-25 16:41:40 [com.opensymphony.oscache.base.Config]-[DEBUG] Config() called
2006-08-25 16:41:40 [com.opensymphony.oscache.base.Config]-[DEBUG] Getting Config
2006-08-25 16:41:40 [com.opensymphony.oscache.base.Config]-[INFO] Properties {cache.algorithm=com.opensymphony.oscache.base.algorithm.LRUCache, cache.capacity=1000, cache.memory=true, cache.event.listeners=com.opensymphony.oscache.extra.ScopeEventListenerImpl}
2006-08-25 16:41:40 [com.opensymphony.oscache.base.AbstractCacheAdministrator]-[DEBUG] Constructed AbstractCacheAdministrator()
2006-08-25 16:41:40 [com.opensymphony.oscache.general.GeneralCacheAdministrator]-[INFO] Constructed GeneralCacheAdministrator()
2006-08-25 16:41:40 [com.opensymphony.oscache.general.GeneralCacheAdministrator]-[INFO] Creating new cache
2006-08-25 16:41:40 [java.sql.Connection]-[DEBUG] {conn-100000} Connection
2006-08-25 16:41:41 [java.sql.PreparedStatement]-[DEBUG] {pstm-100001} PreparedStatement:    select id,name,sex from user where id=? 
2006-08-25 16:41:41 [java.sql.PreparedStatement]-[DEBUG] {pstm-100001} Parameters: [1]
2006-08-25 16:41:41 [java.sql.PreparedStatement]-[DEBUG] {pstm-100001} Types: [java.lang.String]
2006-08-25 16:41:41 [java.sql.ResultSet]-[DEBUG] {rset-100002} ResultSet
2006-08-25 16:41:41 [java.sql.ResultSet]-[DEBUG] {rset-100002} Header: [id, name, sex, id]
2006-08-25 16:41:41 [java.sql.ResultSet]-[DEBUG] {rset-100002} Result: [1, anna li, 5, 1]
com.ibatis.common.jdbc.exception.NestedSQLException:  
--- The error occurred in com/ibatis/demo/sqlmap/map/User.xml. 
--- The error occurred while applying a result map. 
--- Check the User.get-user-result. 
--- The error happened while setting a property on the result object. 
--- Cause: com.ibatis.common.exception.NestedRuntimeException: Error setting properties of 'com.ibatis.demo.User@116ab4e'.  Cause: java.lang.IllegalArgumentException: argument type mismatch
Caused by: java.lang.IllegalArgumentException: argument type mismatch
Caused by: com.ibatis.common.exception.NestedRuntimeException: Error setting properties of 'com.ibatis.demo.User@116ab4e'.  Cause: java.lang.IllegalArgumentException: argument type mismatch
Caused by: java.lang.IllegalArgumentException: argument type mismatch
 at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)
 at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123)
 at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:610)
 at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584)
 at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:101)
 at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:78)
 at com.ibatis.demo.UserDao.getUsers(UserDao.java:92)
 at com.ibatis.demo.UserDao.main(UserDao.java:144)
Caused by: com.ibatis.common.exception.NestedRuntimeException: Error setting properties of 'com.ibatis.demo.User@116ab4e'.  Cause: java.lang.IllegalArgumentException: argument type mismatch
Caused by: java.lang.IllegalArgumentException: argument type mismatch
 at com.ibatis.sqlmap.engine.accessplan.PropertyAccessPlan.setProperties(PropertyAccessPlan.java:51)
 at com.ibatis.sqlmap.engine.exchange.JavaBeanDataExchange.setData(JavaBeanDataExchange.java:112)
 at com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectValues(BasicResultMap.java:346)
 at com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResultObject(RowHandlerCallback.java:63)
 at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:395)
 at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:185)
 at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery(GeneralStatement.java:205)
 at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
 ... 7 more
Caused by: java.lang.IllegalArgumentException: argument type mismatch
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at com.ibatis.sqlmap.engine.accessplan.PropertyAccessPlan.setProperties(PropertyAccessPlan.java:45)
 ... 14 more

package com.ibatis.demo;

import java.io.Serializable;
import java.util.ArrayList;
//import java.util.HashSet;
import java.util.List;
//import java.util.Set;

public class User implements Serializable{

 /**
  *
  */
 private Integer id;
 private String name;
 private Integer sex;
 private List addresses = new ArrayList();
 //iBatis2.0 仅对java.util.List或java.util.Collection类型进行支持。
 //原文:(载自:iBatis SQLMap2-cn.pdf文档)唯一的不同是,让SQL Map架构装入复杂类型集合(List)的业务对象的属性必须是java.util.List或java.util.Collection类型
 //private Set addresses = new HashSet();
 public User(){
 }
 public Integer getId() {
  return id;
 }
 public void setId(Integer id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Integer getSex() {
  return sex;
 }
 public void setSex(Integer sex) {
  this.sex = sex;
 }
// public Set getAddresses() {
//  return addresses;
// }
// public void setAddresses(Set addresses) {
//  this.addresses = addresses;
// }
 public void setAddresses(List addresses) {
  this.addresses = addresses;
 }
 public List getAddresses() {
  return addresses;
 }
 
}

 

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
 <typeAlias alias="user" type="com.ibatis.demo.User" />
 <typeAlias alias="string" type="java.lang.String" />
 <typeAlias alias="address" type="com.ibatis.demo.Address"/>
 <cacheModel id="userCache" type="OSCACHE">
  <flushInterval hours="24" />
  <flushOnExecute statement="updateUser" />
  <flushOnExecute statement="insertUser" />
  <flushOnExecute statement="delUser" />
  <flushOnExecute statement="deleteUser" />
  <property name="size" value="1000" />
 </cacheModel>
 <resultMap id="get-user-result" class="user">
  <result property="id" column="id"/>
  <result property="name" column="name"/>
  <result property="sex" column="sex"/>
  <result property="addresses" column="id" select="getAddressByUserId"/>
 </resultMap>
 <resultMap id="get-address-result" class="address">
  <!-- result property="userid" column="userid"/-->
  <result property="address" column="address"/>
  <result property="zipcode" column="zipcode"/>
 </resultMap>
 <select id="getUsers" parameterClass="string" resultMap="get-user-result">
  select id,name,sex from user where id=#id#
 </select>
 <select id="getAddressByUserId" parameterClass="int" resultMap="get-address-result">
  select address,zipcode from address where userid = #id#
 </select>
 
 <select id="getUser" parameterClass="string" cacheModel="userCache"
  resultClass="user">
  select name,sex from user where name=#name#
 </select>
 <update id="updateUser" parameterClass="user">
  update user set name=#name#, sex=#sex# where id=#id#
 </update>
 <insert id="insertUser" parameterClass="user">
  insert into user( name,sex) values(#name#,#sex#)
 </insert>
 <delete id="deleteUser" parameterClass="string">
  delete from user where id=#id#
 </delete>
 <delete id="delUser" parameterClass="user">
  delete from user where id=#id#
 </delete>
 <select id="getUserList" parameterClass="string"
  cacheModel="userCache" resultClass="user">
  select id ,name,sex from user where name like #name#
 </select>
</sqlMap>



分享到:
评论
2 楼 hellostory 2012-07-31  
这种排版,必将被淘汰!
1 楼 ghost_daxia 2007-06-01  
要注意什么呢?能说清楚一点吗?

相关推荐

    ibatis 一对多 多对多完整映射

    本文将深入探讨如何在iBATIS中实现一对多和多对多的关系映射,并提供相关的源码分析和工具使用技巧。 **一对多关系映射** 在数据库设计中,一对多关系是指一个父记录可以与多个子记录关联,例如,一个用户可以有多...

    ibatis多对多关系(详细)

    在本文档中,我们将详细介绍iBatis在处理多对多关系时的配置和实现。 多对多关系 多对多关系是一种常见的关系数据库设计模式,用于描述两个实体之间的多对多关系。在本例中,我们将使用学生(Student)和教师...

    ibatis 一对多

    本文将深入探讨`iBatis` 中的一对多映射关系,以及如何通过源码理解和使用这个特性。 一对多映射是数据库关系模型中的常见概念,指的是一个父表(如部门表)可以对应多个子表(如员工表),每个部门可以有多个员工...

    ibatis 一对多关系映射

    首先,我们需要在映射文件中定义主表(一对一端)和从表(多对一端)的映射。假设我们有一个`User`类对应`users`表,一个`Order`类对应`orders`表,其中`orders`表有一个`user_id`字段作为外键关联到`users`表。 在...

    ibatis配置多表关联(一对一、一对多、多对多

    ibatis配置多表关联(一对一、一对多、多对多

    ibatis 多对多

    对于多对多关系,合理设置缓存策略可以提高查询效率,但需注意防止数据不一致问题。 6. **事务管理** 在处理多对多关系的增删改查操作时,通常需要涉及多个表,因此需要妥善管理事务,确保数据的一致性。 总结来...

    ibatis 自己学的一个ibatis项目(只是打通了Oracle) 非常适合入门

    自己写了一个Ibatis入门文件 JDK用的1.4 ibatis用的2.3.0 一定要注意版本问题,不然出现本本不兼容很费劲,我调了一上午,注意一定要用JDK1.4 ibatis2.3.0! 数据库自己建一张简单的表就行了,特别说明 只适合新手...

    Ibatis一对一映射提示

    - **延迟加载(Lazy Loading):** 默认情况下,iBATIS会立即加载一对一关联的对象,但这可能导致性能问题。通过配置,可以实现延迟加载,只在真正需要时才加载关联对象。 - **缓存:** 使用iBATIS的缓存机制,可以...

    ibatis应对批量update

    为了解决这个问题,ibatis(现已更名为MyBatis)提供了一种支持批量更新的机制,能够显著提高数据处理的速度。 #### 批量Update背景与问题 在实际应用中,经常会遇到需要批量更新数据库中的数据的情况,例如:商品...

    ibatis多表查询

    在Ibatis中,多表查询是一项重要的功能,它允许我们处理复杂的数据库操作,例如一对多、多对一或一对一的关系。在这个例子中,我们将探讨如何使用Ibatis进行一对多的多表查询,以`book`和`user`两个表为例。 首先,...

    ibatis一对一、多对一示例

    利用ibatis实现一对一、多对一的示例代码。每种关系用两种方式实现,具体的讲解可看我的博客http://blog.csdn.net/duwenchao1986/article/details/8565386

    ibatis实战之一对多关联(源代码)

    本篇将聚焦于iBatis的一对多关联映射实战,帮助开发者更好地理解和运用这一特性。 在关系型数据库中,一对多关联是非常常见的一种数据关系,例如一个用户可以拥有多个订单,一个部门可以包含多个员工等。在iBatis中...

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与Spring及Struts2的集成。 首先,让我们来看一下“一对多”关系。在数据库设计中,一对多关系很常见,比如一个用户可以有多个订单。在Ibatis中,...

    ibatis总结 ibatis ibatis ibatis ibatis

    - `applicationContext.xml`是Spring的主配置文件,它定义了Spring容器中的bean,包括对Struts、Ibatis等其他框架的配置,实现各组件间的依赖注入。 - `codelist.xml`则可能包含了全局共享的bean,如`...

    解决IBatis缓存动态字段问题

    ### 解决IBatis缓存动态字段问题 #### 背景与问题描述 在使用IBatis框架处理数据库操作时,可能会遇到动态数据表名、动态字段名的情况。这种情况下,由于IBatis的缓存机制,可能导致字段找不到的问题。具体表现为...

    ibatis demo,ibatis例子,ibatis示例

    本地缓存作用于单个SqlSession,而二级缓存则可以在多个SqlSession之间共享,但需要注意并发控制和数据一致性问题。 8. **插件支持**:Ibatis允许开发者编写自定义插件,通过拦截器模式对SqlSession或Executor的...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    ResultMap不仅支持简单的列名映射,还能处理复杂的一对多、一对一关系映射。 六、ParameterHandler ParameterHandler负责设置PreparedStatement的参数。`org.apache.ibatis.executor.parameter.ParameterHandler`...

    Ibatis多表查询

    在多表查询中,Ibatis 提供了多种方式来处理复杂的关联查询,包括一对一、一对多、多对一和多对多等关系。在这个例子中,我们将探讨如何在 Ibatis 中实现一对多的关系查询。 首先,我们创建了两个表:`book` 和 `...

    ibatis one to many mapping

    5. `ibatis多对多映射2.htm` 和 `ibatis多对多映射4.html` - 可能是补充材料,提供额外的例子或解决常见问题的方法。 综上所述,iBatis 的一对多和多对多映射是数据库操作中的重要概念,它们通过 ResultMap 和特定...

Global site tag (gtag.js) - Google Analytics