Java 后端 学习笔记 编程 ·

「Java笔记」 持久层的踩坑之路(集中更新)

Mybatis-debug-notes

原文地址:https://www.miaoroom.com/code/note/mybatis-debug-notes.html
出处:喵容

本文会零零碎碎的更新自己在学习 Java持久层 碰到的问题和解决办法,希望这些踩坑的历程能给需要的你带来帮助。

由于文章主要为 Spring Data JPAMybatis 的内容。

1. org.hibernate.AnnotationException: No identifier specified for entity:

private Integer categoryId;

这个错误看上去是这张表没有主键,在使用hibernate的映射表的时候entity类是必须要主键的,否则就会报出这个异常。所以解决如下,添加自增的ID主键:

@Id
@GeneratedValue
private Integer categoryId;

如果我们已经配置了@ID,还会报这个错误是因为import错包了,错误的使用了org.springframework.data.annotation.Id包。

当我们使用@Entity的时候,提示我们Entity过时,被划了横线,是因错误的引用了org.hibernate.annotations.Entity包,这里应该使用JPA的注解javax.persistence.Entity,而不是hibernate的。

Table 'XXX.hibernate_sequence' doesn't exist

在实体中,将ID生成略组改成@GeneratedValue(strategy = GenerationType.IDENTITY)。

如以下:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer categoryId;

删测试数据很麻烦

在方法前加上 @Transactional 注解,会让你当前的事务操作在执行完成后完全回滚。若执行完未报错,则意为测试通过。可搭配Aseert断言使用,这样便省去了我们测试完还要删除测试数据的多余操作。

'PageRequest(int, int)' is deprecated

PageRequest类使用的时候利用new一个对象的时候报错,所这个方法过时了,解决方法

PageRequest pageRequest=new PageRequest(int ,int );//提示方法过时

应该使用

PageRequest request = PageRequest.of(0,1);

一对多查询 java.lang.IllegalStateException: No typehandler found for property

在使用tk.mybatis建立实体的时候我们使mapper继承myMapper不需要我们对mapper.xml文件中写很多重复的代码了,如果因为表中没有实体中对应的字段而出现错误Caused by: java.lang.IllegalStateException: No typehandler found for property xxx,这种情况下就需要你去排查字段。

  1. 如果你有字段没能和数据库中的对应,应该使用@Column(name = "xxx")或者直接把变量名叫的和数据库中字段名字相同。
  2. 当有时我们需要忽略这些字段,那么就可以使用@Transient来加在这个字段的头上。
  3. 如果此时你的程序依旧这样报错,就检查你所有的实体,把所有的实体都检查一遍,修改之后这时你的程序应该就没有错误了。

mybatis传入单个或多个参数

1、传入一个参数时

id为mapper接口中的方法名,resultMap为返回类型,parameterType为输入参数的类型

mapper接口配置:

对应的xml配置:

2、传入多个参数时

mapper接口配置:

对应的xml配置:

由于是多参数那么就不能使用parameterType, 这里用@Param来指定哪一个

参与评论