Browse Source

jpa增加部门上下级自关联,用户部门多对多关联 (#59)

* 添加部门之间多对一关联,部门和用户多对多关联。
pull/1/head
76peter Yangkai.Shen 5 years ago
parent
commit
5dafba9ed2
6 changed files with 227 additions and 5 deletions
  1. +6
    -0
      spring-boot-demo-orm-jpa/pom.xml
  2. +66
    -0
      spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/Department.java
  3. +22
    -5
      spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/User.java
  4. +26
    -0
      spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/repository/DepartmentDao.java
  5. +21
    -0
      spring-boot-demo-orm-jpa/src/main/resources/db/schema.sql
  6. +86
    -0
      spring-boot-demo-orm-jpa/src/test/java/com/xkcoding/orm/jpa/repository/DepartmentDaoTest.java

+ 6
- 0
spring-boot-demo-orm-jpa/pom.xml View File

@@ -59,6 +59,12 @@
<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>

<build>


+ 66
- 0
spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/Department.java View File

@@ -0,0 +1,66 @@
package com.xkcoding.orm.jpa.entity;

import com.xkcoding.orm.jpa.entity.base.AbstractAuditModel;
import lombok.*;

import javax.persistence.*;
import java.util.Collection;

/**
* <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 = "orderno", 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;

}

+ 22
- 5
spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/User.java View File

@@ -3,9 +3,8 @@ package com.xkcoding.orm.jpa.entity;
import com.xkcoding.orm.jpa.entity.base.AbstractAuditModel;
import lombok.*;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.*;
import java.util.Collection;
import java.util.Date;

/**
@@ -19,12 +18,12 @@ import java.util.Date;
* @date: Created in 2018/11/7 14:06
* @copyright: Copyright (c)
* @version: V1.0
* @modified: yangkai.shen
* @modified: 76peter
*/
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@Entity
@Table(name = "orm_user")
@@ -66,4 +65,22 @@ public class User extends AbstractAuditModel {
*/
@Column(name = "last_login_time")
private Date lastLoginTime;


/**
* 关联部门表
*/
@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
//主表就是关系维护端对应的表,从表就是关系被维护端对应的表
private Collection<Department> departmentList;

}

+ 26
- 0
spring-boot-demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/repository/DepartmentDao.java View File

@@ -0,0 +1,26 @@
package com.xkcoding.orm.jpa.repository;

import com.xkcoding.orm.jpa.entity.Department;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Collection;


/**
* <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> {
public Collection<Department> findDepartmentsByLevels(Integer level);
}

+ 21
- 0
spring-boot-demo-orm-jpa/src/main/resources/db/schema.sql View File

@@ -11,3 +11,24 @@ CREATE TABLE `orm_user` (
`last_login_time` DATETIME DEFAULT NULL COMMENT '上次登录时间',
`last_update_time` DATETIME NOT NULL DEFAULT NOW() COMMENT '上次更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Spring Boot Demo Orm 系列示例表';


DROP TABLE IF EXISTS `orm_department`;
CREATE TABLE `orm_department` (
`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
`name` VARCHAR(32) NOT NULL COMMENT '部门名称',
`superior` INT(11) COMMENT '上级id',
`levels` INT(11) NOT NULL COMMENT '层级',
`orderno` INT(11) NOT NULL DEFAULT 0 COMMENT '排序',
`create_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 系列示例表';

--DROP TABLE IF EXISTS `orm_usersetdept`;
CREATE TABLE `orm_usersetdept` (
`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
`userid` INT(11) NOT NULL COMMENT '用户id',
`deptid` INT(11) NOT NULL COMMENT '部门id',
`create_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 系列示例表';

+ 86
- 0
spring-boot-demo-orm-jpa/src/test/java/com/xkcoding/orm/jpa/repository/DepartmentDaoTest.java View File

@@ -0,0 +1,86 @@
package com.xkcoding.orm.jpa.repository;

import com.xkcoding.orm.jpa.SpringBootDemoOrmJpaApplicationTests;
import com.xkcoding.orm.jpa.entity.Department;
import com.xkcoding.orm.jpa.entity.User;
import lombok.extern.slf4j.Slf4j;
import net.minidev.json.JSONArray;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import javax.transaction.Transactional;
import java.util.Collection;
import java.util.List;

/**
* <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);
});
User users = userDao.findById(1L).get();
log.debug("用户部门={}", JSONArray.toJSONString((List)userDao.findById(1L).get().getDepartmentList()));


departmentDao.findById(2L).ifPresent(dept -> {
Collection<User> userlist = dept.getUserList();
//关联关系由user维护中间表,department userlist不会发生变化,可以增加查询方法来处理 重写getUserList方法
log.debug("部门下用户={}", JSONArray.toJSONString((List)userlist));
});


userDao.findById(1L).ifPresent(user -> {
user.setName("清空部门");
user.setDepartmentList(null);
userDao.save(user);
});
log.debug("用户部门={}", userDao.findById(1L).get().getDepartmentList());


}


}

Loading…
Cancel
Save