这一周在翻新公司的老项目,遇到了一些预想不到的事情。

其中一个是,使用hibernate查询,不同的查询条件,居然都查到同一条记录,感觉奇怪了,开始以为是session的原因;

后来发现是hibernate对主键有要求,看了数据库表设计,惨了,居然没有主键,我丢,好多表都没有主键,当时内心是郁闷的,什么人设计的?后来想想,这都十年前的项目了,十年前这个设计水平,也理解吧。

hibernate在数据表所对应的实体类有要求:必须有主键。因为数据表没有主键,于是最初我给其中一个非空字段标记为@Id,后来惨了,因为条件查询只要条件里有这个字段,查出来的都是这条数据。

解决方法:

构建联合主键:

将原来的实体类A分解为两个类:主键类A1 和 实体类A2

  • 主键类A1:将联合主键的字段单独放在类中,该类实现 java.io.Serializable 接口,并重写 equals 和 hascode,再将该类注解为 @Embeddable

@Data
@Embeddable
public class BankParamKey implements Serializable { private String pmcd;
private String pmtp;
private String pmnm; @Override
public boolean equals(Object obj) {
return super.equals(obj);
} @Override
public int hashCode() {
return super.hashCode();
}
}
  • 实体类A2:该类不包含联合主键类中的字段,但保存联合主键类的引用,并生成 set 和 get 方法(此处用lombok自动生成),并将该引用注解为 @Id

@Data
@Entity
@Table(name ="P019")
public class BankParam implements Serializable { @Id
private BankParamKey bankParamKey;//pmcd + pmtp + pmnm 组合主键
private String pmky;
private String pmv4;
private String pmv1;
private String pmv5;
private String pmv2;
private String pmv3;
}

  这样就可用解决使用hibernate但是没有主键的表的问题了。

hibernate不同条件查询结果集一样,主键@ID的原因的更多相关文章

  1. Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射

                                                        Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...

  2. MySQL select if 查询最后一个主键 id

    查询最后一个主键id SELECT IF(MAX(id) IS NULL, 0, MAX(id)) AS maxid FROM users; 查询最小的主键id SELECT IF(MIN(id) I ...

  3. Hibernate save或者persist 后获取主键ID

    一个自增长ID的对象被save或者persist后,会返回其主键ID: Department department = new Department(); department.setName(&qu ...

  4. sql insert、update、delete完以后返回主键ID

    以前只用过在insert完以后利用select @@IDENTITY返回主键ID,最近在做微信公众平台,遇到一个需求是在帮绑定万微信openid后自动完成登陆,这就需要update以后返回主键ID,查 ...

  5. MySQL ORDER BY主键id加LIMIT限制走错索引

    背景及现象 report_product_sales_data表数据量2800万: 经测试,在当前数据量情况下,order by主键id,limit最大到49的时候可以用到索引report_produ ...

  6. 分布式系统中我们会对一些数据量大的业务进行分拆,分布式系统中唯一主键ID的生成问题

    分布式全局唯一ID生成策略​ https://www.cnblogs.com/vandusty/p/11462585.html 一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订 ...

  7. 开启事务时mybatis返回主键id

    先说一下没有注解的 先给出实体类: public class City { private int city_id; private String city_name; public int getC ...

  8. MyBatis+MySQL 返回插入的主键ID

    需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如下: <insert id="i ...

  9. Oracle通过主键id删除记录很慢

    问题描述: Oracle通过主键id删除2000条记录很慢,需要花费十二分钟. 解决过程: 1.首先查看SQL的执行计划,执行计划正常,cost只有4,用到了主键索引. 2.查看等待事件, selec ...

随机推荐

  1. 「萌新指南」SOA vs. 微服务:What’s the Difference?

    实话实说,在我还没有实习之前,我是连 SOA 是啥都不知道的,只听说过微服务,毕竟微服务实在太火了,想不知道都难,我觉得实习的时候肯定也是微服务,进组之后发现是 SOA 架构,当时都懵了,看了很多文档 ...

  2. 面试官问我MySQL索引,我

    面试官:我看你简历上写了MySQL,对MySQL InnoDB引擎的索引了解吗? 候选者:嗯啊,使用索引可以加快查询速度,其实上就是将无序的数据变成有序(有序就能加快检索速度) 候选者:在InnoDB ...

  3. configparser生成模块写

    # -*-coding:utf-8-*-__author__ = "logan.xu"#写配置文件import configparserconfig = configparser. ...

  4. Javascirpt 面向对象总结-公有/私有

    虽说js是一门面向对象的语言,但是它并不像C++,C#,Java等那样,具有典型的面向对象的特征.因此在这里总结一下如何编写具有面向对象特征的程序. [私有变量] 在对象内部使用'var'关键字来声明 ...

  5. 操作系统的IO模型

    IO操作根据设备类型一般分为内存IO,网络IO,和磁盘IO.其中内存IO的速度大大快于后两者,计算机的性能瓶颈一般不在于内存IO. 尽管网络IO可通过购买独享带宽和高速网卡来提升速度,可以使用RAID ...

  6. docker入门及常用命令

    Docker简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布 ...

  7. Appium自动化(12) - 详解 HardwareActions 类里的方法和源码分析

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 HardwareAction ...

  8. IKEv2协议关键知识点总结整理

    文章目录 @[toc] 1. IKEv2基本原理 2. IKEv2协议重点注意事项 2.1 情景一:==IKEv2协商密钥逻辑== ①密钥协商流程 ②函数调用关系 ③流程简述 2.2 情景二:==使用 ...

  9. ABP 极简入门教程(三 权限)

    此处演示为MVC项目,同样权限定义需要到Application中才能在获取API时进行权限验证 一.打开Sample.Core\Authorization\PermissionNames.cs增加授权 ...

  10. PULPino datasheet中文翻译并给了部分论文注释(前四章:Overview、Memory Map、CPU Core、Advanced Debug Unit)

    参考: (1).PULPino datasheet:https://github.com/pulp-platform/pulpino/blob/master/doc/datasheet/datashe ...