bug总结

日常开发中遇到的bug总结.

2021年5月

0x01

现象: JPA 中双向关联如果使用mappedBy会使foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)失效, 如果不使用mappedBy 则会生层一张中间表.
版本: hiernate 5.x
临时解决方案:

  1. 使用已被废弃的注解@org.hiernate.annotations.ForeignKey注解使外键失效.
  2. 自行去除外键,并且jpa.hibernate.dll-auto设置为none.
  3. 去除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
2
3
4
5
6
7
8
9
@Column(name = "c_tester_name", columnDefinition = "VARCHAR(20) NOT NULL COMMENT '测试者姓名'")
private String name;

@Column(name = "c_tester_phoneNum", columnDefinition = "VARCHAR(20) NOT NULL COMMENT '测试者联系电话'")
private String phoneNum;

@ManyToOne
@JoinColumn(name = "c_project_num", referencedColumnName = "c_project_number", nullable = false , foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private Project project;

在根据项目编号和电话号码查询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非主键关联,如果上级实体类和下级实体类同时包含另一个实体类,如下: PatientRecheck都包含Department对象,同时Recheck又包含Patient对象,

1
2
3
4
Patient: 
@ManyToOne
@JoinColumn(name = "c_department_code", referencedColumnName = "c_code" ,nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), columnDefinition = "VARCHAR(20) COMMENT '部门code, 关联t_department表'")
private Department department;
1
2
3
4
5
6
7
8
9
10
Recheck: 

@ManyToOne
@JoinColumn(name = "c_patient_id", columnDefinition = "int comment '病患id'", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private Patient patient;

@ManyToOne
@JoinColumn(name = "c_department_code", referencedColumnName = "c_code" ,nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), columnDefinition = "VARCHAR(20) COMMENT '部门code, 关联t_department表'")
private Department department;

此时查询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