如何实现JPA关联操作


一、JPA多表查询

关联映射

在软件开发中,类与类之间最普通的关系就是关联关系,而且关联是有方向的.

单向多对一关联

以角色和用户为例
(用户对角色:单向多对一)
在实体类中把角色id缓存实体类,如下代码

@ManyToOne(targetEntity = Role.class)
  @JoinColumn(name="logid")//角色id
  private Role role;//角色类

@ManyToOne注解映射多对一的关联关系,targetEntity属性表示关联实体类型,可省略.
@JoinColumn注解映射关联的外键字段,如不指定,则表示生成一种新表维护两个对象之间的关系.

双向一对多

修改Role实体类,新增setuser属性(使用set集合避免重复对象),用来表示一对多关联,在属性上添加@OneToMany注解,映射一对多关联关系

@OneToMany(targetEntity = User.class,fetch = FetchType.EAGER,cascade = CascadeType.PERSIST,mappedBy = "role")
    private Set<User>users=new HashSet<User>();
  • targetEntity属性表示关联的实体类型
  • fetch属性表示加载策略,FetchType取值有LAZY及EAGER,LAZY表示延迟加载,EAGER表示立即加载
    @ManyTonOne注解也有此属性,默认值为EAGER
  • cascade属性表示级联操作,cascadeType取值有PERSIST,REMOVE,ALL…等
    PERSIST:删除角色时,会先把有外键关系的用户删除(级联关系)
    REMOVE:删除级联关系.
    ALL:级联所有操作(小心使用)
    @ManyTonOne注解也有此属性,但一般不在多的一方进行级联操作.
  • mappedBy属性用来设置对象之间的关系维护方.如果不指定mappedBy属性,则对象均由自己维护关系(外键),操作一方对象时,会二维产生更新的sql语句,所有一般OneToMany注解中指定mappedBy属性,且属性值为多方对象中关联的一方属性名,并且此时一方实体类中不能添加@JoinColumn注解.
    示例代码
 Role role=new Role("略略略");//构造函数赋值角色名
       User user=new User("测试1",role);
       User user2=new User("测试2",role);
       role.getUsers().add(user);
       role.getUsers().add(user2);
       roleRepository.save(role);//保存一个角色以及两个用户


版权声明:本文为weixin_50011512原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。