@@ -1,7 +1,10 @@ | |||||
# spring-boot-demo-orm-jpa | # spring-boot-demo-orm-jpa | ||||
> 此 demo 主要演示了 Spring Boot 如何使用 JPA 操作数据库。 | |||||
> 此 demo 主要演示了 Spring Boot 如何使用 JPA 操作数据库,包含简单使用以及级联使用。 | |||||
## 主要代码 | |||||
### pom.xml | |||||
## pom.xml | |||||
```xml | ```xml | ||||
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
@@ -78,7 +81,7 @@ | |||||
</project> | </project> | ||||
``` | ``` | ||||
## JpaConfig.java | |||||
### JpaConfig.java | |||||
```java | ```java | ||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -123,7 +126,7 @@ public class JpaConfig { | |||||
} | } | ||||
} | } | ||||
``` | ``` | ||||
## User.java | |||||
### User.java | |||||
```java | ```java | ||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -136,12 +139,12 @@ public class JpaConfig { | |||||
* @date: Created in 2018/11/7 14:06 | * @date: Created in 2018/11/7 14:06 | ||||
* @copyright: Copyright (c) | * @copyright: Copyright (c) | ||||
* @version: V1.0 | * @version: V1.0 | ||||
* @modified: yangkai.shen | |||||
* @modified: 76peter | |||||
*/ | */ | ||||
@EqualsAndHashCode(callSuper = true) | @EqualsAndHashCode(callSuper = true) | ||||
@Data | |||||
@NoArgsConstructor | @NoArgsConstructor | ||||
@AllArgsConstructor | @AllArgsConstructor | ||||
@Data | |||||
@Builder | @Builder | ||||
@Entity | @Entity | ||||
@Table(name = "orm_user") | @Table(name = "orm_user") | ||||
@@ -183,9 +186,86 @@ public class User extends AbstractAuditModel { | |||||
*/ | */ | ||||
@Column(name = "last_login_time") | @Column(name = "last_login_time") | ||||
private Date lastLoginTime; | private Date lastLoginTime; | ||||
/** | |||||
* 关联部门表 | |||||
* 1、关系维护端,负责多对多关系的绑定和解除 | |||||
* 2、@JoinTable注解的name属性指定关联表的名字,joinColumns指定外键的名字,关联到关系维护端(User) | |||||
* 3、inverseJoinColumns指定外键的名字,要关联的关系被维护端(Department) | |||||
* 4、其实可以不使用@JoinTable注解,默认生成的关联表名称为主表表名+下划线+从表表名, | |||||
* 即表名为user_department | |||||
* 关联到主表的外键名:主表名+下划线+主表中的主键列名,即user_id,这里使用referencedColumnName指定 | |||||
* 关联到从表的外键名:主表中用于关联的属性名+下划线+从表的主键列名,department_id | |||||
* 主表就是关系维护端对应的表,从表就是关系被维护端对应的表 | |||||
*/ | |||||
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) | |||||
@JoinTable(name = "orm_user_dept", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "dept_id", referencedColumnName = "id")) | |||||
private Collection<Department> departmentList; | |||||
} | } | ||||
``` | ``` | ||||
## AbstractAuditModel.java | |||||
### Department.java | |||||
```java | |||||
/** | |||||
* <p> | |||||
* 部门实体类 | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.orm.jpa.entity | |||||
* @description: 部门实体类 | |||||
* @author: 76peter | |||||
* @date: Created in 2019/10/1 18:07 | |||||
* @copyright: Copyright (c) 2019 | |||||
* @version: V1.0 | |||||
* @modified: 76peter | |||||
*/ | |||||
@EqualsAndHashCode(callSuper = true) | |||||
@Data | |||||
@NoArgsConstructor | |||||
@AllArgsConstructor | |||||
@Builder | |||||
@Entity | |||||
@Table(name = "orm_department") | |||||
@ToString(callSuper = true) | |||||
public class Department extends AbstractAuditModel { | |||||
/** | |||||
* 部门名 | |||||
*/ | |||||
@Column(name = "name", columnDefinition = "varchar(255) not null") | |||||
private String name; | |||||
/** | |||||
* 上级部门id | |||||
*/ | |||||
@ManyToOne(cascade = {CascadeType.REFRESH}, optional = true) | |||||
@JoinColumn(name = "superior", referencedColumnName = "id") | |||||
private Department superior; | |||||
/** | |||||
* 所属层级 | |||||
*/ | |||||
@Column(name = "levels", columnDefinition = "int not null default 0") | |||||
private Integer levels; | |||||
/** | |||||
* 排序 | |||||
*/ | |||||
@Column(name = "order_no", columnDefinition = "int not null default 0") | |||||
private Integer orderNo; | |||||
/** | |||||
* 子部门集合 | |||||
*/ | |||||
@OneToMany(cascade = {CascadeType.REFRESH, CascadeType.REMOVE}, fetch = FetchType.EAGER, mappedBy = "superior") | |||||
private Collection<Department> children; | |||||
/** | |||||
* 部门下用户集合 | |||||
*/ | |||||
@ManyToMany(mappedBy = "departmentList") | |||||
private Collection<User> userList; | |||||
} | |||||
``` | |||||
### AbstractAuditModel.java | |||||
```java | ```java | ||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -228,7 +308,7 @@ public abstract class AbstractAuditModel implements Serializable { | |||||
private Date lastUpdateTime; | private Date lastUpdateTime; | ||||
} | } | ||||
``` | ``` | ||||
## UserDao.java | |||||
### UserDao.java | |||||
```java | ```java | ||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -248,7 +328,33 @@ public interface UserDao extends JpaRepository<User, Long> { | |||||
} | } | ||||
``` | ``` | ||||
## application.yml | |||||
### DepartmentDao.java | |||||
```java | |||||
/** | |||||
* <p> | |||||
* User Dao | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.orm.jpa.repository | |||||
* @description: Department Dao | |||||
* @author: 76peter | |||||
* @date: Created in 2019/10/1 18:07 | |||||
* @copyright: Copyright (c) 2019 | |||||
* @version: V1.0 | |||||
* @modified: 76peter | |||||
*/ | |||||
@Repository | |||||
public interface DepartmentDao extends JpaRepository<Department, Long> { | |||||
/** | |||||
* 根据层级查询部门 | |||||
* | |||||
* @param level 层级 | |||||
* @return 部门列表 | |||||
*/ | |||||
List<Department> findDepartmentsByLevels(Integer level); | |||||
} | |||||
``` | |||||
### application.yml | |||||
```yaml | ```yaml | ||||
server: | server: | ||||
port: 8080 | port: 8080 | ||||
@@ -290,7 +396,7 @@ logging: | |||||
org.hibernate.SQL: debug | org.hibernate.SQL: debug | ||||
org.hibernate.type: trace | org.hibernate.type: trace | ||||
``` | ``` | ||||
## UserDaoTest.java | |||||
### UserDaoTest.java | |||||
```java | ```java | ||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -403,7 +509,82 @@ public class UserDaoTest extends SpringBootDemoOrmJpaApplicationTests { | |||||
} | } | ||||
``` | ``` | ||||
### DepartmentDaoTest.java | |||||
```java | |||||
/** | |||||
* <p> | |||||
* jpa 测试类 | |||||
* </p> | |||||
* | |||||
* @package: com.xkcoding.orm.jpa.repository | |||||
* @description: jpa 测试类 | |||||
* @author: 76peter | |||||
* @date: Created in 2018/11/7 14:09 | |||||
* @copyright: Copyright (c) 2018 | |||||
* @version: V1.0 | |||||
* @modified: 76peter | |||||
*/ | |||||
@Slf4j | |||||
public class DepartmentDaoTest extends SpringBootDemoOrmJpaApplicationTests { | |||||
@Autowired | |||||
private DepartmentDao departmentDao; | |||||
@Autowired | |||||
private UserDao userDao; | |||||
/** | |||||
* 测试保存 ,根节点 | |||||
*/ | |||||
@Test | |||||
@Transactional | |||||
public void testSave() { | |||||
Collection<Department> departmentList = departmentDao.findDepartmentsByLevels(0); | |||||
if (departmentList.size() == 0) { | |||||
Department testSave1 = Department.builder().name("testSave1").orderNo(0).levels(0).superior(null).build(); | |||||
Department testSave1_1 = Department.builder().name("testSave1_1").orderNo(0).levels(1).superior(testSave1).build(); | |||||
Department testSave1_2 = Department.builder().name("testSave1_2").orderNo(0).levels(1).superior(testSave1).build(); | |||||
Department testSave1_1_1 = Department.builder().name("testSave1_1_1").orderNo(0).levels(2).superior(testSave1_1).build(); | |||||
departmentList.add(testSave1); | |||||
departmentList.add(testSave1_1); | |||||
departmentList.add(testSave1_2); | |||||
departmentList.add(testSave1_1_1); | |||||
departmentDao.saveAll(departmentList); | |||||
Collection<Department> deptall = departmentDao.findAll(); | |||||
log.debug("【部门】= {}", JSONArray.toJSONString((List) deptall)); | |||||
} | |||||
userDao.findById(1L).ifPresent(user -> { | |||||
user.setName("添加部门"); | |||||
Department dept = departmentDao.findById(2L).get(); | |||||
user.setDepartmentList(departmentList); | |||||
userDao.save(user); | |||||
}); | |||||
log.debug("用户部门={}", JSONUtil.toJsonStr(userDao.findById(1L).get().getDepartmentList())); | |||||
departmentDao.findById(2L).ifPresent(dept -> { | |||||
Collection<User> userlist = dept.getUserList(); | |||||
//关联关系由user维护中间表,department userlist不会发生变化,可以增加查询方法来处理 重写getUserList方法 | |||||
log.debug("部门下用户={}", JSONUtil.toJsonStr(userlist)); | |||||
}); | |||||
userDao.findById(1L).ifPresent(user -> { | |||||
user.setName("清空部门"); | |||||
user.setDepartmentList(null); | |||||
userDao.save(user); | |||||
}); | |||||
log.debug("用户部门={}", userDao.findById(1L).get().getDepartmentList()); | |||||
} | |||||
} | |||||
``` | |||||
### 其余代码及 SQL 参见本 demo | |||||
## 参考 | ## 参考 | ||||
Spring Data JPA 官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ | |||||
- Spring Data JPA 官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ |
@@ -1,80 +1,74 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
<modelVersion>4.0.0</modelVersion> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<artifactId>spring-boot-demo-orm-jpa</artifactId> | |||||
<version>1.0.0-SNAPSHOT</version> | |||||
<packaging>jar</packaging> | |||||
<artifactId>spring-boot-demo-orm-jpa</artifactId> | |||||
<version>1.0.0-SNAPSHOT</version> | |||||
<packaging>jar</packaging> | |||||
<name>spring-boot-demo-orm-jpa</name> | |||||
<description>Demo project for Spring Boot</description> | |||||
<name>spring-boot-demo-orm-jpa</name> | |||||
<description>Demo project for Spring Boot</description> | |||||
<parent> | |||||
<groupId>com.xkcoding</groupId> | |||||
<artifactId>spring-boot-demo</artifactId> | |||||
<version>1.0.0-SNAPSHOT</version> | |||||
</parent> | |||||
<parent> | |||||
<groupId>com.xkcoding</groupId> | |||||
<artifactId>spring-boot-demo</artifactId> | |||||
<version>1.0.0-SNAPSHOT</version> | |||||
</parent> | |||||
<properties> | |||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | |||||
<java.version>1.8</java.version> | |||||
</properties> | |||||
<properties> | |||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | |||||
<java.version>1.8</java.version> | |||||
</properties> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-data-jpa</artifactId> | |||||
</dependency> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-data-jpa</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>mysql</groupId> | |||||
<artifactId>mysql-connector-java</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>mysql</groupId> | |||||
<artifactId>mysql-connector-java</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-test</artifactId> | |||||
<scope>test</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-starter-test</artifactId> | |||||
<scope>test</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>cn.hutool</groupId> | |||||
<artifactId>hutool-all</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>cn.hutool</groupId> | |||||
<artifactId>hutool-all</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.google.guava</groupId> | |||||
<artifactId>guava</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.google.guava</groupId> | |||||
<artifactId>guava</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.projectlombok</groupId> | |||||
<artifactId>lombok</artifactId> | |||||
<optional>true</optional> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.alibaba</groupId> | |||||
<artifactId>fastjson</artifactId> | |||||
<version>1.2.58</version> | |||||
<scope>test</scope> | |||||
</dependency> | |||||
</dependencies> | |||||
<dependency> | |||||
<groupId>org.projectlombok</groupId> | |||||
<artifactId>lombok</artifactId> | |||||
<optional>true</optional> | |||||
</dependency> | |||||
</dependencies> | |||||
<build> | |||||
<finalName>spring-boot-demo-orm-jpa</finalName> | |||||
<plugins> | |||||
<plugin> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-maven-plugin</artifactId> | |||||
</plugin> | |||||
</plugins> | |||||
</build> | |||||
<build> | |||||
<finalName>spring-boot-demo-orm-jpa</finalName> | |||||
<plugins> | |||||
<plugin> | |||||
<groupId>org.springframework.boot</groupId> | |||||
<artifactId>spring-boot-maven-plugin</artifactId> | |||||
</plugin> | |||||
</plugins> | |||||
</build> | |||||
</project> | </project> |
@@ -38,8 +38,8 @@ public class Department extends AbstractAuditModel { | |||||
/** | /** | ||||
* 上级部门id | * 上级部门id | ||||
*/ | */ | ||||
@ManyToOne(cascade = {CascadeType.REFRESH},optional = true) | |||||
@JoinColumn(name = "superior",referencedColumnName = "id") | |||||
@ManyToOne(cascade = {CascadeType.REFRESH}, optional = true) | |||||
@JoinColumn(name = "superior", referencedColumnName = "id") | |||||
private Department superior; | private Department superior; | ||||
/** | /** | ||||
* 所属层级 | * 所属层级 | ||||
@@ -49,12 +49,12 @@ public class Department extends AbstractAuditModel { | |||||
/** | /** | ||||
* 排序 | * 排序 | ||||
*/ | */ | ||||
@Column(name = "orderno", columnDefinition = "int not null default 0") | |||||
private Integer orderno; | |||||
@Column(name = "order_no", columnDefinition = "int not null default 0") | |||||
private Integer orderNo; | |||||
/** | /** | ||||
* 子部门集合 | * 子部门集合 | ||||
*/ | */ | ||||
@OneToMany(cascade={CascadeType.REFRESH, CascadeType.REMOVE}, fetch = FetchType.EAGER,mappedBy="superior") | |||||
@OneToMany(cascade = {CascadeType.REFRESH, CascadeType.REMOVE}, fetch = FetchType.EAGER, mappedBy = "superior") | |||||
private Collection<Department> children; | private Collection<Department> children; | ||||
/** | /** | ||||
@@ -66,21 +66,19 @@ public class User extends AbstractAuditModel { | |||||
@Column(name = "last_login_time") | @Column(name = "last_login_time") | ||||
private Date lastLoginTime; | private Date lastLoginTime; | ||||
/** | /** | ||||
* 关联部门表 | * 关联部门表 | ||||
* 1、关系维护端,负责多对多关系的绑定和解除 | |||||
* 2、@JoinTable注解的name属性指定关联表的名字,joinColumns指定外键的名字,关联到关系维护端(User) | |||||
* 3、inverseJoinColumns指定外键的名字,要关联的关系被维护端(Department) | |||||
* 4、其实可以不使用@JoinTable注解,默认生成的关联表名称为主表表名+下划线+从表表名, | |||||
* 即表名为user_department | |||||
* 关联到主表的外键名:主表名+下划线+主表中的主键列名,即user_id,这里使用referencedColumnName指定 | |||||
* 关联到从表的外键名:主表中用于关联的属性名+下划线+从表的主键列名,department_id | |||||
* 主表就是关系维护端对应的表,从表就是关系被维护端对应的表 | |||||
*/ | */ | ||||
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) | @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) | ||||
@JoinTable(name = "orm_usersetdept",joinColumns = @JoinColumn(name = "userid",referencedColumnName="id"), | |||||
inverseJoinColumns = @JoinColumn(name = "deptid",referencedColumnName="id")) | |||||
//1、关系维护端,负责多对多关系的绑定和解除 | |||||
//2、@JoinTable注解的name属性指定关联表的名字,joinColumns指定外键的名字,关联到关系维护端(User) | |||||
//3、inverseJoinColumns指定外键的名字,要关联的关系被维护端(Department) | |||||
//4、其实可以不使用@JoinTable注解,默认生成的关联表名称为主表表名+下划线+从表表名, | |||||
//即表名为user_department | |||||
//关联到主表的外键名:主表名+下划线+主表中的主键列名,即user_id,这里使用referencedColumnName指定 | |||||
//关联到从表的外键名:主表中用于关联的属性名+下划线+从表的主键列名,department_id | |||||
//主表就是关系维护端对应的表,从表就是关系被维护端对应的表 | |||||
@JoinTable(name = "orm_user_dept", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "dept_id", referencedColumnName = "id")) | |||||
private Collection<Department> departmentList; | private Collection<Department> departmentList; | ||||
} | } |
@@ -4,7 +4,7 @@ import com.xkcoding.orm.jpa.entity.Department; | |||||
import org.springframework.data.jpa.repository.JpaRepository; | import org.springframework.data.jpa.repository.JpaRepository; | ||||
import org.springframework.stereotype.Repository; | import org.springframework.stereotype.Repository; | ||||
import java.util.Collection; | |||||
import java.util.List; | |||||
/** | /** | ||||
@@ -22,5 +22,11 @@ import java.util.Collection; | |||||
*/ | */ | ||||
@Repository | @Repository | ||||
public interface DepartmentDao extends JpaRepository<Department, Long> { | public interface DepartmentDao extends JpaRepository<Department, Long> { | ||||
public Collection<Department> findDepartmentsByLevels(Integer level); | |||||
/** | |||||
* 根据层级查询部门 | |||||
* | |||||
* @param level 层级 | |||||
* @return 部门列表 | |||||
*/ | |||||
List<Department> findDepartmentsByLevels(Integer level); | |||||
} | } |
@@ -19,16 +19,16 @@ CREATE TABLE `orm_department` ( | |||||
`name` VARCHAR(32) NOT NULL COMMENT '部门名称', | `name` VARCHAR(32) NOT NULL COMMENT '部门名称', | ||||
`superior` INT(11) COMMENT '上级id', | `superior` INT(11) COMMENT '上级id', | ||||
`levels` INT(11) NOT NULL COMMENT '层级', | `levels` INT(11) NOT NULL COMMENT '层级', | ||||
`orderno` INT(11) NOT NULL DEFAULT 0 COMMENT '排序', | |||||
`order_no` INT(11) NOT NULL DEFAULT 0 COMMENT '排序', | |||||
`create_time` DATETIME NOT NULL DEFAULT NOW() COMMENT '创建时间', | `create_time` DATETIME NOT NULL DEFAULT NOW() COMMENT '创建时间', | ||||
`last_update_time` DATETIME NOT NULL DEFAULT NOW() COMMENT '上次更新时间' | `last_update_time` DATETIME NOT NULL DEFAULT NOW() COMMENT '上次更新时间' | ||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Spring Boot Demo Orm 系列示例表'; | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Spring Boot Demo Orm 系列示例表'; | ||||
--DROP TABLE IF EXISTS `orm_usersetdept`; | |||||
CREATE TABLE `orm_usersetdept` ( | |||||
DROP TABLE IF EXISTS `orm_user_dept`; | |||||
CREATE TABLE `orm_user_dept` ( | |||||
`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键', | `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键', | ||||
`userid` INT(11) NOT NULL COMMENT '用户id', | |||||
`deptid` INT(11) NOT NULL COMMENT '部门id', | |||||
`user_id` INT(11) NOT NULL COMMENT '用户id', | |||||
`dept_id` INT(11) NOT NULL COMMENT '部门id', | |||||
`create_time` DATETIME NOT NULL DEFAULT NOW() COMMENT '创建时间', | `create_time` DATETIME NOT NULL DEFAULT NOW() COMMENT '创建时间', | ||||
`last_update_time` DATETIME NOT NULL DEFAULT NOW() COMMENT '上次更新时间' | `last_update_time` DATETIME NOT NULL DEFAULT NOW() COMMENT '上次更新时间' | ||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Spring Boot Demo Orm 系列示例表'; | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Spring Boot Demo Orm 系列示例表'; |
@@ -1,5 +1,6 @@ | |||||
package com.xkcoding.orm.jpa.repository; | package com.xkcoding.orm.jpa.repository; | ||||
import cn.hutool.json.JSONUtil; | |||||
import com.xkcoding.orm.jpa.SpringBootDemoOrmJpaApplicationTests; | import com.xkcoding.orm.jpa.SpringBootDemoOrmJpaApplicationTests; | ||||
import com.xkcoding.orm.jpa.entity.Department; | import com.xkcoding.orm.jpa.entity.Department; | ||||
import com.xkcoding.orm.jpa.entity.User; | import com.xkcoding.orm.jpa.entity.User; | ||||
@@ -39,11 +40,12 @@ public class DepartmentDaoTest extends SpringBootDemoOrmJpaApplicationTests { | |||||
@Transactional | @Transactional | ||||
public void testSave() { | public void testSave() { | ||||
Collection<Department> departmentList = departmentDao.findDepartmentsByLevels(0); | Collection<Department> departmentList = departmentDao.findDepartmentsByLevels(0); | ||||
if(departmentList.size()==0){ | |||||
Department testSave1 = Department.builder().name("testSave1").orderno(0).levels(0).superior(null).build(); | |||||
Department testSave1_1 = Department.builder().name("testSave1_1").orderno(0).levels(1).superior(testSave1).build(); | |||||
Department testSave1_2 = Department.builder().name("testSave1_2").orderno(0).levels(1).superior(testSave1).build(); | |||||
Department testSave1_1_1 = Department.builder().name("testSave1_1_1").orderno(0).levels(2).superior(testSave1_1).build(); | |||||
if (departmentList.size() == 0) { | |||||
Department testSave1 = Department.builder().name("testSave1").orderNo(0).levels(0).superior(null).build(); | |||||
Department testSave1_1 = Department.builder().name("testSave1_1").orderNo(0).levels(1).superior(testSave1).build(); | |||||
Department testSave1_2 = Department.builder().name("testSave1_2").orderNo(0).levels(1).superior(testSave1).build(); | |||||
Department testSave1_1_1 = Department.builder().name("testSave1_1_1").orderNo(0).levels(2).superior(testSave1_1).build(); | |||||
departmentList.add(testSave1); | departmentList.add(testSave1); | ||||
departmentList.add(testSave1_1); | departmentList.add(testSave1_1); | ||||
departmentList.add(testSave1_2); | departmentList.add(testSave1_2); | ||||
@@ -51,7 +53,7 @@ public class DepartmentDaoTest extends SpringBootDemoOrmJpaApplicationTests { | |||||
departmentDao.saveAll(departmentList); | departmentDao.saveAll(departmentList); | ||||
Collection<Department> deptall = departmentDao.findAll(); | Collection<Department> deptall = departmentDao.findAll(); | ||||
log.debug("【部门】= {}", JSONArray.toJSONString((List)deptall)); | |||||
log.debug("【部门】= {}", JSONArray.toJSONString((List) deptall)); | |||||
} | } | ||||
@@ -61,14 +63,14 @@ public class DepartmentDaoTest extends SpringBootDemoOrmJpaApplicationTests { | |||||
user.setDepartmentList(departmentList); | user.setDepartmentList(departmentList); | ||||
userDao.save(user); | userDao.save(user); | ||||
}); | }); | ||||
User users = userDao.findById(1L).get(); | |||||
log.debug("用户部门={}", JSONArray.toJSONString((List)userDao.findById(1L).get().getDepartmentList())); | |||||
log.debug("用户部门={}", JSONUtil.toJsonStr(userDao.findById(1L).get().getDepartmentList())); | |||||
departmentDao.findById(2L).ifPresent(dept -> { | departmentDao.findById(2L).ifPresent(dept -> { | ||||
Collection<User> userlist = dept.getUserList(); | Collection<User> userlist = dept.getUserList(); | ||||
//关联关系由user维护中间表,department userlist不会发生变化,可以增加查询方法来处理 重写getUserList方法 | //关联关系由user维护中间表,department userlist不会发生变化,可以增加查询方法来处理 重写getUserList方法 | ||||
log.debug("部门下用户={}", JSONArray.toJSONString((List)userlist)); | |||||
log.debug("部门下用户={}", JSONUtil.toJsonStr(userlist)); | |||||
}); | }); | ||||
@@ -79,8 +81,6 @@ public class DepartmentDaoTest extends SpringBootDemoOrmJpaApplicationTests { | |||||
}); | }); | ||||
log.debug("用户部门={}", userDao.findById(1L).get().getDepartmentList()); | log.debug("用户部门={}", userDao.findById(1L).get().getDepartmentList()); | ||||
} | } | ||||
} | } |