今天研究生了下一对一,一对多,多对多三种方式在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);
}
}
如下图,所有数据已经被存储进去