jpa继承实体类

现在实际开发中开始使用spring-boot 2.0,其中安全性组件security非常好用,集成了用户验证和权限控制以及密码加密。不过实际开发中用户往往不只一种,比如一个项目中,用户就包括teacher ,student。他们的属性是不同的,放一个用户表里不合适,这就要用到entity的继承。
entity的继承有三种方式,我们这里只说最适合上面这种情况的一种:联合子类策略
先上代码:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class SysUser {
@Id
@GeneratedValue
protected Integer id;
protected String username;
protected String password;
protected String name;

setting,getting......

}

@Entity
public class Student extends SysUser {
private String banji;

setting,getting......

}

@Entity
public class Teacher extends SysUser{
private String job;

setting,getting......

}

数据库里会自动给我们建立三个表,sys_user,student,teacher。其中sys_user 表里会有四个字段,id,username,password,name student表里会有两个字段,id,banji。teacher表里会有两个字段id,job。那我们如何操作呢,还是先上持久层的代码。
@Repository
public interface UserRepository extends JpaRepository<SysUser, Integer> {

}
@Repository
public interface StudentRepository extends JpaRepository<Student, Integer> {

}
@Repository
public interface TeacherRepository extends JpaRepository<Teacher, Integer> {

}
持久层我们建了三个接口,分别对应上面三个表。先来看如何向数据库里写数据吧。
@RunWith(SpringRunner.class)
@SpringBootTest
public class EntityApplicationTests {
@Autowired
private TeacherRepository teacherDAO;
@Autowired
private StudentRepository studentDAO;
@Autowired
private UserRepository userDAO;
@Autowired
private ObjectMapper mapper;

@Test
public void contextLoads() {
    Teacher t1=new Teacher();
    t1.setName("张老师");
    t1.setUsername("t01");
    t1.setPassword("1111");
    t1.setJob("班主任");
    teacherDAO.save(t1);
    Student s1=new Student();
    s1.setName("李学生");
    s1.setBanji("软件1班");
    s1.setUsername("20170101");
    s1.setPassword("2222");
    studentDAO.save(s1);
}

}
上面测试类代码分别用spring 注入的teacherDAO,studentDAO向数据库里保存了t1,s1两个对象,其中t1是教师,s1是学生。那我们看一下数据库,
sys_user表里加了两条记录:
id name password username
1 张老师 1111 t01
2 李学生 2222 20170101
teacher 表里加了一条记录:
id job
1 班主任
student表里加了一条记录:
id banji
2 软件1班

分析一下,teacher,和student表中的id其实是外键,用来关联sys_user表的主键id的。
如何读呢?我们可以用上面持久层的任何一个接口去完成数据的读取工作。修改测试类如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class EntityApplicationTests {
@Autowired
private TeacherRepository teacherDAO;
@Autowired
private StudentRepository studentDAO;
@Autowired
private UserRepository userDAO;
@Autowired
private ObjectMapper mapper;

@Test
public void contextLoads() {
    
    SysUser user=userDAO.findById(1).get();
    Student s2=userDAO.findById(2).get();
    try {
        System.out.println(mapper.writeValueAsString(user));
        System.out.println(mapper.writeValueAsString(s2));
    } catch (JsonProcessingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}
运行后控制台输出为:
{“id”:1,“username”:“t01”,“password”:“1111”,“name”:“张老师”,“job”:“班主任”}
{“id”:2,“username”:“20170101”,“password”:“2222”,“name”:“李学生”,“banji”:“软件1班”}
重点看第一行,这是在输出user,可从输出结果来看,这明显是Teacher,完全可以强制成Teacher再用。
用上面的结构来作为security的用户数据的保存方式,可以完美解决多种用户登录验证的问题!

猜你喜欢

转载自blog.csdn.net/qq_40205116/article/details/83176071
今日推荐