日常开发中遇到的bug总结.
2021年5月
0x01
现象: JPA 中双向关联如果使用mappedBy会使foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)失效, 如果不使用mappedBy 则会生层一张中间表.
版本: hiernate 5.x
临时解决方案:
- 使用已被废弃的注解
@org.hiernate.annotations.ForeignKey注解使外键失效. - 自行去除外键,并且
jpa.hibernate.dll-auto设置为none. - 去除
mappedBy, 接受中间表.
stackoverflow 地址: https://stackoverflow.com/questions/41729709/how-do-i-disable-hibernate-foreign-key-constraint-on-a-bidirectional-association
0x02
现象: zipInputstream 或者 zip4j 无法解压7zip软件打包的的压缩包
版本: 2.4.2
解决方案: 无.
issue: https://github.com/srikanth-lingala/zip4j/issues/45
0x03
现象: junrar 无法解压rar5版本的压缩包,也就是新版本的winrar打包的压缩包是无法解压的
版本: 2.4.2
解决方案: 无
issue: https://github.com/junrar/junrar/issues/23
0x04
现象: 文件上传时,使用@RequestParam, swagger2无法生成对应的文件参数文档.
版本: swagger2 3.x
解决方法: 使用@RequsetPart 注解multipart参数
0x05
现象: Spring data JPA 不支持hibernate中的@FetchMode,无法通过该注解直接实现join查询来避免N+1问题 版本: 2.4.2 解决方案: 使用@EntityGraph解决该问题,可以无限向下关联;或者使用原生sql查询;spring data jpa自带的一些方法无法做到多级join`,即使使用的该注解,这个问题很奇怪.
stackoverflow: https://stackoverflow.com/questions/30479748/jpa-how-to-define-namedentitygraph-for-3-levels
0x06
现象: Hibernate或者jpa 实现多个实体类join, 如果是hibernate 则在使用@FetchMode.JOIN时候属性列指定为List会报错, 如果是 spring data jpa 多个属性列为List 则不能同时使用FetchType.EAGRE
版本: 2.4.2
解决方案: 使用Set作为属性的类型
stackoverflow: https://stackoverflow.com/questions/4334970/hibernate-throws-multiplebagfetchexception-cannot-simultaneously-fetch-multipl
2021年6月
0x01
现象: JPA 对于非主键关联支持报错, Tester单向关联了Project类的c_project_number,
1 |
|
在根据项目编号和电话号码查询Tester对向时,如果不存在Tester对象,无任何问题,存在Tester对象则报错,报错如下:
com.xxx.entity.Project is in unnamed module of loader 'app'; java.io.Serializable is in module java.base of loader 'bootstrap',
版本: 2.4.2
解决方案: 初步判断为查找出Tester对象时,关联出Project对象, 此时被app这个classLoader加载, 导致问题,具体深层次原因未深究, 此处临时解决办法是不使用c_project_number字段关联, 使用Project类的主键进行关联.
stackoverflow: ttps://stackoverflow.com/questions/61862202/using-jpa-elementcollection-for-a-string-collection-from-a-join-table
2022年6月
0x01
现象JPA非主键关联,如果上级实体类和下级实体类同时包含另一个实体类,如下: Patient和Recheck都包含Department对象,同时Recheck又包含Patient对象,
1 | Patient: |
1 | Recheck: |
此时查询Recheck集合会出现多出查询问题,会单独出现一条语句,查询Recheck里面的Department对象,如果List<Rechck>都是同一个部门那么,只会查询一次Deparment对象,如果对应多个部门,则会查询多个部门.如果Department使用主键关联则不会出现这种问题.
怀疑和非主键关联无法lazy加载有关,但是又不像.
版本:spring-data-jpa 2.6.0, hibernate-core 5.6.3
解决方案:EntityGraph去除patient查询,或者使用主键关联
stackoverflow: https://stackoverflow.com/questions/30082281/manytoonefetch-fetchtype-lazy-doesnt-work-on-non-primary-key-referenced-co