spring data jpa + mysql 上踩过的坑

最近在做一个小项目,技术上用的是springboot+jpa(Java Persistence API)

spring data jpa让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现,他是实现了orm思想的一套框架。

(1)先让实体类和数据库表对应,再让实体类属性和表里面字段对应

@Entity
@Table(name = "t_user")
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String nickname;
    private String username;
    private String password;
    getter and setter...
}

(2)不需要直接操作数据库表,直接操作表对应的实体类对象

public interface UserRepository extends JpaRepository<User,Long> {

    User findByUsernameAndPassword(String username, String password);
}

好了,问题就出在这第一步里的实体类属性和表里面字段对应

注意这个注解 @GeneratedValue ,他共有四种取值:(strategy = ***)

  • AUTO主键由程序控制, 是默认选项 ,不设置就是这个

  • IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式

  • SEQUENCE 通过数据库的序列产生主键, MYSQL 不支持

  • Table 提供特定的数据库产生主键, 该方式更有利于数据库的移植

以下是我今天解决问题过程中的一些想法,不一定对,仅供参考

在对应主键字段的属性上要是只标注了@GeneratedValue那就意味着把主键的生成策略交给了springboot,它将自动的判断你所使用的数据库,若是Mysql则设置成IDENTITY,Oracle则设置成SEQUENCE。

但我今天是用jpa自动生成的数据库
在这里插入图片描述
最上面举的实体类的例子也正是我编写实体类采用的注解方式,下面是我定义的实体类一共五个。
在这里插入图片描述
由于其中两个类之间的关系是多对多,所以按道理最终生成的表应该是六张,也就是五张实体类对应表和一张中间表。但实际情况确实这样的:
在这里插入图片描述
没错,他多了一张表!多了一张貌似相当于Oracle中的序列表(我也不太懂Oracle…就是觉得长的像)这张表只有一个字段,并且其他几张表的主键自增长都没有打开
在这里插入图片描述
在这里插入图片描述
就是指定了你下一个自动生成的主键的值,关键是所有表共用这个序列表,举个例子:

A表插入一条数据后自动生成的id=10,接下来你取B表插入一条数据,他生成的id就一定会接下去(=11)

如果你先在数据库中手动创建几条数据,让id的值超过序列表中的值
在这里插入图片描述
然后在项目系统中使用增加数据功能时就会…

Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘13’ for key ‘PRIMARY’

破坏了完整性约束,在这里也就是说表中出现了重复的主键id=13,然后我不干任何事,在系统中再次执行我的添加功能:

Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘14’ for key ‘PRIMARY’

那个序列表就会自增1然后再添加,发现id=14又已经存在了。相信大家已经看懂这序列表的机制了吧,就是说只要我在系统中在执行一次添加功能,这条数据就能够被加进数据库里了。



这样也太麻烦了吧,解决它其实很简单,只要在实体类中手动指定主键的生成策略,并且将表中对应主键字段的 自动递增打开 就行了,springboot就会放弃那张序列表而按照你指定的方式去生成主键了:

@Entity
@Table(name = "t_user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nickname;
    private String username;
    private String password;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值