Spring boot + JPA一对一、一对多、多对多关系

application.properties配置文件

############################################
##  MySQL数据库连接
############################################
spring.datasource.url = jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driverClassName = com.mysql.jdbc.Driver
############################################
##  配置自动建表:updata:没有表新建,有表更新操作,控制台显示建表语句
############################################
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
############################################
# 加载mybatis 配置的Mapper
############################################
mybatis.mapper-locations=classpath:mybatisMapper/*Mapper.xml

1、用户实体类(jpa自动创建表)

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "subname")
    private String subname;

    @Column(name = "password")
    private String password;

    @Column(name = "telephone")
    private String telephone;

    @ManyToOne
    @JoinColumn(name = "address_id")
    private Address addresses;

    @OneToOne
    @JoinColumn(name = "idcard_id")
    private IdCard idcard;

    @ManyToMany
    @JoinTable(name = "user_role",
            joinColumns = @JoinColumn(name = "u_id",referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "r_id", referencedColumnName = "id") )
    private Set<Role> roles;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    public String getSubname() {
        return subname;
    }

    public void setSubname(String subname) {
        this.subname = subname;
    }

    public Address getAddresses() {
        return addresses;
    }

    public void setAddresses(Address addresses) {
        this.addresses = addresses;
    }

    public IdCard getIdcard() {
        return idcard;
    }

    public void setIdcard(IdCard idcard) {
        this.idcard = idcard;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}

2、身份证实体类(jpa自动创建表)

@Entity
@Table(name = "idcard")
public class IdCard {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id" )
    private Integer id;
    
    @Column(name = "num" )
    private String num;

    @JsonIgnore
    @OneToOne(fetch = FetchType.LAZY, mappedBy = "idcard")
    private User user;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

3、地址实体类(jpa自动创建表)

@Entity
@Table(name = "address")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id")
    private Integer id;

    @Column(name = "address")
    private String address;

   /* @JsonIgnore
    @OneToMany(mappedBy = "addresses")
    private User user;*/

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    /*public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }*/
}

4、角色实体类(jpa自动创建表)

@Entity
@Table(name = "role")
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @JsonIgnore
    @ManyToMany(mappedBy = "roles")
    private Set<User> users;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }
}

5、手动创建user_role中间表(用于多对多映射)

create table user_role(
u_id int(11) NOT NULL,
r_id int(11) NOT NULL,
primary key(u_id,r_id),
foreign key(u_id) references user(id),
foreign key(r_id) references role(id)
)ENGINE=MyISAM DEFAULT CHARSET=utf8

  ENGIN可以根据自己建表的情况设定,一般为InnoDB

6、封装用于返回的结果(DataResponseVo)

public class DataResponseVo extends BaseResponseVo implements Serializable{
    private static final long serialVersionUID = 8197244837986532584L;
    private Object content;

    public DataResponseVo() {
    }

    public DataResponseVo(Object content) {
        this.content = content;
    }

    public DataResponseVo(int code, Object content) {
        super(code);
        this.content = content;
    }

    public Object getContent() {
        return content;
    }

    public void setContent(Object content) {
        this.content = content;
    }

}

7、写接口调用

@RequestMapping(value = "/findall", method = RequestMethod.GET, produces = {"application/json"})
public DataResponseVo findAllUser() {
    List<User> users = userDao.findAll();
    return new DataResponseVo(0,users);
}

8、返回结果为

{
    "code": 0,
    "content": [
        {
            "id": 1,
            "name": "张三",
            "subname": "XX",
            "password": "123456",
            "telephone": "1000000",
            "addresses": {
                "id": 1,
                "address": "山东济南市"
            },
            "idcard": {
                "id": 2,
                "num": "3729092xxxxxxx"
            },
            "roles": [
                {
                    "id": 1,
                    "name": "系统管理员"
                },
                {
                    "id": 3,
                    "name": "普通用户"
                },
                {
                    "id": 2,
                    "name": "管理员"
                }
            ]
        },
        {
            "id": 2,
            "name": "李四",
            "subname": "Q",
            "password": "123456",
            "telephone": "1786xxxxxx3",
            "addresses": {
                "id": 1,
                "address": "山东济南市"
            },
            "idcard": {
                "id": 1,
                "num": "37299219XXXXXXXXX"
            },
            "roles": [
                {
                    "id": 3,
                    "name": "普通用户"
                }
            ]
        }
    ]
}

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值