SpringBoot整合SpringDataJPA
实现多对多关系的维护 user <1----n-> user_roles <-n-----1> roles
[前言]
- 关于lombok
lombok可以使用但是在多对多,一对多,多对一关系中,一定要有一方去重写它的“toString()”方法,方法里面移出,否则springDataJP自己对应关系的A会一直递归调用,最终内存溢出
1、依赖
<!--记得修改自己对应的版本-->
<!-- mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
<!-- springDataJPA支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2、application.yml配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/erp?useUnicode=true&charecterEncoding=utf-8
username: root
password: root
jpa:
#是否显示sql
show-sql: true
properties:
hibernate:
#格式化sql
format_sql: true
database: mysql
# 数据库方言
database-platform: org.hibernate.dialect.MySQLInnoDBDialect
3、pojo实体类
- User
@Component @Entity @Table(name = "users") @Data @AllArgsConstructor @NoArgsConstructor public class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "uid") private Integer id; @Column(name = "uname") private String name; @Column(name = "upassword") private String password; @Column(name = "salt") private String salt; @Column(name = "state") private Integer state; @ManyToMany() @JoinTable(name = "users_roles", joinColumns = { @JoinColumn(name = "uid", referencedColumnName = "uid") }, inverseJoinColumns = { @JoinColumn(name = "rid", referencedColumnName = "rid") }) private List<Roles> roles;
- Roles
@Component @Entity @Table(name = "roles") @Data @AllArgsConstructor @NoArgsConstructor public class Roles { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "rid") private Integer id; @Column(name = "rname") private String name; @ManyToMany(mappedBy = "roles",fetch = FetchType.LAZY) private List<User> users; // 必须重写toString并且吧users的变量移出 @Override public String toString() { return "Roles{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
3、dao接口
- UserDao
//继承JpaRepository<实体类型,主键类型> // JpaSpecifiactionExecutor<实体类型> public interface UserDao extends JpaRepository<User,Integer>, JpaSpecificationExecutor<User> { }
- RolesDao
public interface RolesDao extends JpaRepository<Roles,Integer>, JpaSpecificationExecutor<Roles> { }
5、测试
@Transactional,在测试环境中必须加上事务
@Test
@Transactional
public void contextLoads() {
List<User> all = userDao.findAll();
System.out.println(all);
}