HIbernate逐渐入门02—一对一,一对多,多对多映射

5 篇文章 0 订阅
2 篇文章 0 订阅

今天研究生了下一对一,一对多,多对多三种方式在Jpa中如何实用
一.一对一

@Data
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    //开启级联操作
    @OneToOne(cascade = CascadeType.PERSIST)
    private Student student;
}
@Data
@Entity
@Table(name = "student")
public class Student {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}

这样就完成了一对一的关系映射

二.一对多

@Data
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @OneToMany(mappedBy = "user",cascade=CascadeType.ALL,fetch=FetchType.LAZY)
    //级联保存、更新、删除、刷新;延迟加载。当删除用户,会级联删除该用户的所有文章
    //拥有mappedBy注解的实体类为关系被维护端
    //mappedBy="author"中的author是Article中的author属性
    private List<Article> articleList;//文章列表
}
@Data
@Entity
@Table(name = "article")
public class Article {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)//可选属性optional=false,表示author不能为空。删除文章,不影响用户
    @JoinColumn(name="user_id")//设置在article表中的关联字段(外键)
    private User user;//所属作者
}

这样就完成了一对多的关系映射

三.多对多

@Data
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @ManyToMany
    @JoinTable(name = "user_authority",joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "authority_id"))
    //1、关系维护端,负责多对多关系的绑定和解除
    //2、@JoinTable注解的name属性指定关联表的名字,joinColumns指定外键的名字,关联到关系维护端(User)
    //3、inverseJoinColumns指定外键的名字,要关联的关系被维护端(Authority)
    //4、其实可以不使用@JoinTable注解,默认生成的关联表名称为主表表名+下划线+从表表名,
    //即表名为user_authority
    //关联到主表的外键名:主表名+下划线+主表中的主键列名,即user_id
    //关联到从表的外键名:主表中用于关联的属性名+下划线+从表的主键列名,即authority_id
    //主表就是关系维护端对应的表,从表就是关系被维护端对应的表
    private List<Authority> authorityList;
}
@Data
@Entity
public class Authority {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(nullable = false)
    private String name; //权限名
    @ManyToMany(mappedBy = "authorityList")
    private List<User> userList;
}

这样就完成了多对多的关系映射

另外我们在测试时需要两个类来继承jpa原有的方法

@Repository
public interface UserRepository extends
        JpaRepository<User,Integer>, JpaSpecificationExecutor<User> {
}
public interface AuthorityRepository extends
        JpaRepository<Authority,Integer>, JpaSpecificationExecutor<Authority> {
}

测试代码

@Service
public class UserService {
    @Autowired
    private UserRepository UserRepository;
    @Autowired
    private AuthorityRepository authorityRepository;
    public void Insert() {
    	//一对一测试 一对多测试
        User aa=new User();
        aa.setName("aaa");;
        Student bb=new Student();
        bb.setName("bb");
        Article a1=new Article();
        Article a2=new Article();
        a1.setName("cc");
        a2.setName("dd");
        a1.setUser(aa);
        a2.setUser(aa);
        List<Article> s = new ArrayList<>();
        s.add(a1);
        s.add(a2);
        aa.setArticleList(s);
        aa.setStudent(bb);
        UserRepository.save(aa);
		
		//一对多测试
        Authority authority = new Authority();
        Authority authority2 = new Authority();
        authority.setName("ROLE_ADMIN");
        authority2.setName("2222");
        authorityRepository.save(authority);
        authorityRepository.save(authority2);
        User user = new User();
        user.setName("admin");
        List<Authority> authorityList = new ArrayList<>();
        authorityList.add(authority);
        authorityList.add(authority2);
        user.setAuthorityList(authorityList);
        UserRepository.save(user);
    }
}

如下图,所有数据已经被存储进去
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值