`
zhpengfei0915
  • 浏览: 65498 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

jpa多对多

 
阅读更多

维护端注解

@ManyToMany(cascade=CascadeType.REFRESH)

@JoinTable(//关联表

name="student_teacher", //关联表名

inverseJoinColumns=@JoinColumn(name="teacher_id"),//被维护端外键

joinColumns=@JoinColumn(name="student_id"))//维护端外键

被维护端注解

@ManyToMany(

cascade = CascadeType.REFRESH,

mappedBy = "teachers",//通过维护端的属性关联

fetch = FetchType.LAZY)

关系维护端删除时,如果中间表存在些纪录的关联信息,则会删除该关联信息;

关系被维护端删除时,如果中间表存在些纪录的关联信息,则会删除失败.

以学生和老师的对应关系为例。一个学生可以拥有多个老师,一个老师也可以拥有多个学生。

学生实体类

Student.java代码 收藏代码
  1. packagecom.taoistwar.jpa.entity.manytomany;
  2. importjava.util.HashSet;
  3. importjava.util.Set;
  4. importjavax.persistence.CascadeType;
  5. importjavax.persistence.Column;
  6. importjavax.persistence.Entity;
  7. importjavax.persistence.GeneratedValue;
  8. importjavax.persistence.GenerationType;
  9. importjavax.persistence.Id;
  10. importjavax.persistence.JoinColumn;
  11. importjavax.persistence.JoinTable;
  12. importjavax.persistence.ManyToMany;
  13. @Entity
  14. publicclassStudent{
  15. privateIntegerid;
  16. privateStringname;
  17. privateSet<Teacher>teachers=newHashSet<Teacher>();
  18. @Id
  19. @GeneratedValue(strategy=GenerationType.AUTO)
  20. publicIntegergetId(){
  21. returnid;
  22. }
  23. publicvoidsetId(Integerid){
  24. this.id=id;
  25. }
  26. @Column(nullable=false,length=16)
  27. publicStringgetName(){
  28. returnname;
  29. }
  30. publicvoidsetName(Stringname){
  31. this.name=name;
  32. }
  33. @ManyToMany(cascade=CascadeType.REFRESH)
  34. @JoinTable(name="student_teacher",inverseJoinColumns=@JoinColumn(name="teacher_id"),joinColumns=@JoinColumn(name="student_id"))
  35. publicSet<Teacher>getTeachers(){
  36. returnteachers;
  37. }
  38. publicvoidsetTeachers(Set<Teacher>teachers){
  39. this.teachers=teachers;
  40. }
  41. publicvoidaddTeacher(Teacherteacher){
  42. this.teachers.add(teacher);
  43. }
  44. publicvoidremoveTeachers(Teacherteacher){
  45. this.teachers.remove(teacher);
  46. }
  47. }

重点在于:

Java代码 收藏代码
  1. @ManyToMany(cascade=CascadeType.REFRESH)
  2. @JoinTable(name="student_teacher",inverseJoinColumns=@JoinColumn(name="teacher_id"),joinColumns=@JoinColumn(name="student_id"))
  3. publicSet<Teacher>getTeachers(){
  4. returnteachers;
  5. }

老师实体类

Teacher.java代码 收藏代码
  1. packagecom.taoistwar.jpa.entity.manytomany;
  2. importjava.util.HashSet;
  3. importjava.util.Set;
  4. importjavax.persistence.CascadeType;
  5. importjavax.persistence.Column;
  6. importjavax.persistence.Entity;
  7. importjavax.persistence.FetchType;
  8. importjavax.persistence.GeneratedValue;
  9. importjavax.persistence.GenerationType;
  10. importjavax.persistence.Id;
  11. importjavax.persistence.ManyToMany;
  12. @Entity
  13. publicclassTeacher{
  14. privateIntegerid;
  15. privateStringname;
  16. privateSet<Student>students=newHashSet<Student>();
  17. @Id
  18. @GeneratedValue(strategy=GenerationType.AUTO)
  19. publicIntegergetId(){
  20. returnid;
  21. }
  22. publicvoidsetId(Integerid){
  23. this.id=id;
  24. }
  25. @Column(nullable=false,length=16)
  26. publicStringgetName(){
  27. returnname;
  28. }
  29. publicvoidsetName(Stringname){
  30. this.name=name;
  31. }
  32. @ManyToMany(cascade=CascadeType.REFRESH,mappedBy="teachers",fetch=FetchType.LAZY)
  33. publicSet<Student>getStudents(){
  34. returnstudents;
  35. }
  36. publicvoidsetStudents(Set<Student>students){
  37. this.students=students;
  38. }
  39. @Override
  40. publicinthashCode(){
  41. finalintprime=31;
  42. intresult=1;
  43. result=prime*result+((id==null)?0:id.hashCode());
  44. returnresult;
  45. }
  46. @Override
  47. publicbooleanequals(Objectobj){
  48. if(this==obj)
  49. returntrue;
  50. if(obj==null)
  51. returnfalse;
  52. if(getClass()!=obj.getClass())
  53. returnfalse;
  54. Teacherother=(Teacher)obj;
  55. if(id==null){
  56. if(other.id!=null)
  57. returnfalse;
  58. }elseif(!id.equals(other.id))
  59. returnfalse;
  60. returntrue;
  61. }
  62. }

重点在于:

Java代码 收藏代码
  1. @ManyToMany(cascade=CascadeType.REFRESH,mappedBy="teachers",fetch=FetchType.LAZY)
  2. publicSet<Student>getStudents(){
  3. returnstudents;
  4. }

拥有mappedBy注解的实体类为关系被维护端,另外的实体类为关系维护端的。顾名思意,关系的维护端对关系(在多对多为中间关联表)的CRUD做操作。关系的被维护端没有该操作,不能维护关系。

测试类

Java代码 收藏代码
  1. packagecom.taoistwar.jpa.entity.manytomany;
  2. importjavax.persistence.EntityManager;
  3. importjavax.persistence.EntityManagerFactory;
  4. importjavax.persistence.Persistence;
  5. importorg.junit.Test;
  6. publicclassManyToMany{
  7. @Test
  8. publicvoidsave(){
  9. EntityManagerFactoryemf=Persistence
  10. .createEntityManagerFactory("JPAPU");
  11. EntityManagerem=emf.createEntityManager();
  12. em.getTransaction().begin();
  13. Studentstudent=newStudent();
  14. student.setName("小李");
  15. Teacherteacher=newTeacher();
  16. teacher.setName("大李");
  17. em.persist(student);
  18. em.persist(teacher);
  19. em.getTransaction().commit();
  20. emf.close();
  21. }
  22. @Test
  23. publicvoidbind(){
  24. EntityManagerFactoryemf=Persistence
  25. .createEntityManagerFactory("JPAPU");
  26. EntityManagerem=emf.createEntityManager();
  27. em.getTransaction().begin();
  28. Studentstudent=em.find(Student.class,1);
  29. Teacherteacher=em.find(Teacher.class,1);
  30. student.addTeacher(teacher);
  31. em.persist(student);
  32. em.getTransaction().commit();
  33. emf.close();
  34. }
  35. @Test
  36. publicvoidunbind(){
  37. EntityManagerFactoryemf=Persistence
  38. .createEntityManagerFactory("JPAPU");
  39. EntityManagerem=emf.createEntityManager();
  40. em.getTransaction().begin();
  41. Studentstudent=em.find(Student.class,1);
  42. Teacherteacher=em.find(Teacher.class,1);
  43. student.removeTeachers(teacher);
  44. em.persist(student);
  45. em.getTransaction().commit();
  46. emf.close();
  47. }
  48. @Test
  49. publicvoidremoveTeacher(){
  50. EntityManagerFactoryemf=Persistence
  51. .createEntityManagerFactory("JPAPU");
  52. EntityManagerem=emf.createEntityManager();
  53. em.getTransaction().begin();
  54. //关系被维护端删除时,如果中间表存在些纪录的关联信息,则会删除失败
  55. em.remove(em.getReference(Teacher.class,1));
  56. em.getTransaction().commit();
  57. emf.close();
  58. }
  59. @Test
  60. publicvoidremoveStudent(){
  61. EntityManagerFactoryemf=Persistence
  62. .createEntityManagerFactory("JPAPU");
  63. EntityManagerem=emf.createEntityManager();
  64. em.getTransaction().begin();
  65. //关系维护端删除时,如果中间表存在些纪录的关联信息,则会删除该关联信息
  66. em.remove(em.getReference(Student.class,1));
  67. em.getTransaction().commit();
  68. emf.close();
  69. }
  70. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics