Mybatis 嵌套一对一或一对多关系映射

2023-12-27

我使用 myBatis 来映射一个简单的数据库(作为示例)。

它由4个型号组成:User, Car, Tariff, 保险.

User has 私人列表 carList and 私人关税关税以及其他一些带有 getter 和 setter 的字段。

Car has 私人保险保险以及其他一些带有 getter 和 setter 的字段。

所以我只能映射第一个嵌套级别。我的意思是我可以绘制地图User及其领域 -Tariff和一个列表Cars。但我无法绘制地图保险现场Car。我应该怎么办?

这是我的mapper.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 = "UserNamespace">
    <resultMap id="resultUser" type="User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <association property="tariff" column="tariff" select="getTariff" javaType="Tariff"/>
        <collection property="carList" column="id" select="getCars" javaType="ArrayList" ofType="Car">
            <id property="id" column="id"/>
            <result property="model" column="model"/>
            <association property="insurance" column="insurance" select="getInsurance" javaType="Insurance"/>
        </collection>
    </resultMap>

    <select id = "getAll" resultMap = "resultUser">
        SELECT * FROM carwashservice.users
    </select>

    <select id = "getTariff" parameterType="int" resultType="Tariff">
        SELECT tariffs.description FROM carwashservice.tariffs WHERE tariffs.id = #{id}
    </select>

    <select id = "getCars" parameterType="int" resultType="Car">
        SELECT * FROM carwashservice.cars WHERE cars.user = #{id}
    </select>

    <select id = "getInsurance" parameterType="int" resultType="Insurance">
        SELECT * FROM carwashservice.insurance WHERE insurance.id = #{insurance}
    </select>
</mapper>

还有我的数据库:

CREATE DATABASE  IF NOT EXISTS `carwashservice` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `carwashservice`;

DROP TABLE IF EXISTS `cars`;
CREATE TABLE `cars` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `model` VARCHAR(45) NOT NULL,
  `user` INT(11) DEFAULT NULL,
  `insurance` INT(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `user_idx` (`user`),
  KEY `insurance_idx` (`insurance`),
  CONSTRAINT `user` FOREIGN KEY (`user`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `insurance`;
CREATE TABLE `insurance` (
  `id` INT(11) NOT NULL,
  `cost` VARCHAR(45) NOT NULL,
  `exp_date` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `id` FOREIGN KEY (`id`) REFERENCES `cars` (`insurance`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `tariffs`;
CREATE TABLE `tariffs` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `description` VARCHAR(45) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`id`,`description`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` INT(11) NOT NULL,
  `name` VARCHAR(45) NOT NULL,
  `tariff` INT(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `tariff_idx` (`tariff`),
  KEY `id` (`id`,`name`),
  CONSTRAINT `tariff` FOREIGN KEY (`tariff`) REFERENCES `tariffs` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

您应该提取汽车映射:<collection property="carList" column="id" select="getCars" javaType="ArrayList" ofType="Car" />

在单独的 resultMap 中:<resultMap id="resultCar" type="Car"> <id property="id" column="id"/> <result property="model" column="model"/> <association property="insurance" column="insurance" select="getInsurance" javaType="Insurance"/> </resultMap>

并从声明中引用它<select id = "getCars" parameterType="int" resultMap="resultCar">

您正在使用resultType="Car"。这对于基本映射来说很好,但是与保险有关联:这不是基本的并且需要特定的映射。

此外,getCars语句使用它自己的resultMap,然后是你在里面定义的carList集合实际上被忽略(超出范围)。这就是保险清单为空的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis 嵌套一对一或一对多关系映射 的相关文章

  • Envers 多级实体修订指南

    用户有 n 个联系人 联系人可以有本地化的评论 评论在联系人之间共享 爪哇豆 Audited Entity public class User OneToMany fetch FetchType EAGER cascade CascadeT
  • Hibernate @OneToMany 注释到底是如何工作的?

    我对 Hibernate 还很陌生 我正在通过教程学习它 我在理解到底如何一对多注释作品 所以我有这两个实体类 Student代表一个学生并且Guide代表指导学生的人 因此 每个学生都与一名向导相关联 但一名向导可以跟随多个学生 我想要一
  • 使用 AutoMapper 展开 DTO

    我一直在尝试使用 AutoMapper 来节省从 DTO 到域对象的时间 但是我在配置地图以使其正常工作时遇到了麻烦 并且我开始怀疑 AutoMapper 是否可能是错误的工具工作 考虑这个域对象的示例 一个实体和一个值 public cl
  • 无法使用 datastax java 驱动程序通过 UDT 密钥从 cassandra 检索

    我正在尝试使用用户定义的类型作为分区键将对象存储在 cassandra 中 我正在使用 datastax java 驱动程序进行对象映射 虽然我能够插入到数据库中 但无法检索该对象 如果我更改分区键以使用非 udt 例如文本 我就能够保存和
  • 三角形纹理映射OpenGL

    我正在开发一个使用 Marching Cubes 算法并将数据更改为 3D 模型的项目 现在我想在 OpenGL 中为我的 3D 模型使用纹理映射 我首先尝试了一个简单的示例 它将图片映射到三角形上 这是我的代码 int DrawGLSce
  • 如何模拟MyBatis映射器接口?

    我正在为我的 Jersey Rest API 编写单元测试 该 API 在后台使用 MyBatis 这是我的课程结构 休息服务 Path api public class HelloRestService Inject HelloBean
  • Spring Service @Transactional 不回滚事务 Mybatis SqlSession

    目标是在失败时回滚所有 任何事务 但这并没有按预期工作 我们使用Spring MVC JMS Service Mybatis 在日志中 JMS 设置为回滚 但行已插入且未回滚 想知道我错过了什么或做错了什么吗 最近添加了 Transacti
  • 使用 Java 8 Spring 4 + MyBatis 集成问题

    使用 Java 8 1 8 0 60 Spring 4 2 1 和 MyBatis 3 3 0 时遇到以下异常 Sep 29 2015 11 02 58 AM org springframework context annotation A
  • 如何配置Spring使JPA(Hibernate)和JDBC(JdbcTemplate或MyBatis)共享同一个事务

    我有一个数据源 我使用 Spring 3 0 3 Hibernate 3 5 1 作为 JPA 提供程序 我使用 MyBatis 3 0 2 进行一些查询 我的应用程序在 Tomcat 6 上运行 我有一个 HibernateDAO 和一个
  • 实体框架层次结构的代码优先映射

    我有一个看起来像这样的模型 public class Category public string Id get set public string Description get set public Category Parent ge
  • 延迟阴影映射 GLSL

    我目前正在实施延迟渲染管道 但我仍坚持使用阴影贴图 我已经成功地将其实施到前向管道中 我所做的步骤是 获取灯光视图中的位置 转换为光视图剪辑空间 使用 0 5 0 5 获取阴影纹理坐标 检查深度 编辑 使用新结果图像更新代码 float c
  • 如何在 JSON 中查找特定值并在 JavaScript 中显示这些值中的最小值?

    我是 JS 新手 正在尝试完成一项任务 但没有找到确切的解决方案 这是我第一次发帖 有什么不对的地方请大家指正 这是我的问题 这是我的 JSON 文件的一小部分 该文件有 3000 多行 我已经给出了同一 JSON 文件的确切格式 stat
  • 如何将嵌套对象数组转换为 CSV?

    我有一个包含嵌套对象的数组 例如 name 1 children name 1 1 children 1 2 id 2 thing name 2 1 children 2 2 name 3 stuff name 3 1 children 3
  • Symfony2 和 Doctrine,OneToOne 关系中的 Column 不能为 null

    这是一个实体 编辑 完整文件内容 Eve MoonBundle Entity MoonMaterial php namespace Eve MoonBundle Entity use Doctrine ORM Mapping as ORM
  • 如何使用 Jackson 将列表内容序列化为平面 JSON 对象?

    给定以下 POJO public class City private String title private List
  • 根据查询参数将相同的URL映射到Spring中的不同控制器

    我正在使用基于 spring 注解的控制器 我希望我的 URL user messages 映射到某个控制器 a 如果存在查询参数标记 否则映射到某个不同的控制器 b 这是必需的 因为当存在参数标签时 可以存在更多参数以及我想要在不同控制器
  • Mybatis XML 与注解

    我读过有关Mybatis的书籍和文档 XML和Annotation都可以满足我的要求 但是从myBatis官方网站来看 他们声称XML是做Mappers的更好方法 因为Java注释有局限性 我个人更喜欢注释 例如 public interf
  • 使用 .fromkeys 初始化嵌套字典[重复]

    这个问题在这里已经有答案了 您好 我想知道创建嵌套字典时使用 fromkeys 方法创建嵌套字典不起作用 x 1 2 3 4 5 y 7 8 9 10 11 zx dict fromkeys x dict fromkeys y 0 它创建一
  • 查找嵌套列表中元素的索引?

    我有一个类似的列表 mylist lt list a 1 b list A 1 B 2 c list C 1 D 3 是否有一种 无循环 方法来识别元素的位置 例如如果我想用 5 替换 C 的值 并且在哪里找到元素 C 并不重要 我可以这样
  • * foreach 里面的 foreach codeigniter 2?

    在 codeigniter 2 1 中 我尝试按类别显示频道 因此 如果我有一个名为 电影 的类别 我应该会看到电影中的频道列表 我尝试使用嵌套的 foreach 循环来完成此任务 但似乎无法使其工作 我的表结构是这样的 但更复杂 我的型号

随机推荐