一、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版权协议,转载请附上原文出处链接和本声明。