Jpa Bidirectional Multi-to-Multi-relationship, jpa Bidirectional Multi-to-Relationship
Compared with other associations, many-to-many relationships are a little more complex. This complexity is mainly reflected in the understanding of such associations. Different from other associations, this association has an intermediate table, and the operation is a little more complicated. Let's take a look.
1. entity definition
Student table:
package org.lxh.info;import java.util.*;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;@Entitypublic class Student {private Integer id;private String name;private Set<Teacher> teachers;@Id@GeneratedValuepublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}@Column(length = 50)public String getName() {return name;}public void setName(String name) {this.name = name;}@ManyToMany(cascade=CascadeType.REFRESH)@JoinTable(name="student_teacher",inverseJoinColumns=@JoinColumn(name="teacherId"),joinColumns=@JoinColumn(name="stuId"))public Set<Teacher> getTeachers() {return teachers;}public void setTeachers(Set<Teacher> teachers) {this.teachers = teachers;}}
@ ManyToMany indicates multiple-to-multiple associations. In rare cases, cascade deletion is used. Here I set cascade refresh; because an intermediate table exists, @ JoinTable is used to set the name after the joined table. inverseJoinColumn is used to configure the intermediate table field corresponding to the primary key of the maintained link, joinColumn is configured with the intermediate table field corresponding to the primary key of The Link maintainer. This is the most complicated part.
Teacher table:
package org.lxh.info;import java.util.*;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.ManyToMany;@Entitypublic class Teacher {private Integer id;private String name;private Set<Student> students; @Id @GeneratedValuepublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;} @Column(length=50)public String getName() {return name;}public void setName(String name) {this.name = name;} @ManyToMany(cascade=CascadeType.REFRESH,mappedBy="teachers")public Set<Student> getStudents() {return students;}public void setStudents(Set<Student> students) {this.students = students;}}
The object is defined here. Note that only the link maintenance party can update the foreign key records in the intermediate table. Otherwise, an error is reported.
2 multiple-to-Multiple Data Storage
/*** Bidirectional multiple-to-multiple save */@ org. junit. testpublic void testMany2ManyInsert () {EntityManager em = null; EntityTransaction tx = null; try {em = JpaUtil. getEntityManager (); tx = em. getTransaction (); tx. begin (); Student s = new Student (); s. setName ("Zhang Xiaohua"); Student s2 = new Student (); s2.setName ("Chen Xiaoming"); Set <Student> students = new HashSet <Student> (); students. add (s); students. add (s2); Teacher t = new Teacher (); t. setName ("instructor Li"); t. setStudents (st Udents); Teacher t2 = new Teacher (); t2.setName (""); t2.setStudents (students); Set <Teacher> teachers = new HashSet <Teacher> (); teachers. add (t); teachers. add (t2); s. setTeachers (teachers); s2.setTeachers (teachers); em. persist (s); em. persist (s2); em. persist (t); em. persist (t2); tx. commit ();} catch (Exception e) {e. printStackTrace ();} finally {if (em! = Null) {em. close ();}}}
The Save operation is relatively simple, but if you want to delete or remove the association, it is a little complicated. Let's look at this code.
@ Org. junit. testpublic void testMany2ManyDelete () {EntityManager em = null; EntityTransaction tx = null; try {em = JpaUtil. getEntityManager (); tx = em. getTransaction (); tx. begin (); Student s = em. find (Student. class, 1); Student s2 = em. find (Student. class, 2); Teacher t = em. find (Teacher. class, 2); // first disassociate s. getTeachers (). remove (t); s2.getTeachers (). remove (t); // The data can be deleted through the maintenance end after the link is unbound. remove (t); tx. commit ();} catch (effectio N e) {e. printStackTrace ();} finally {if (em! = Null) {em. close ();}}}
At last, we will summarize the key points for using associations: clarify the relationship maintenance end and the link maintenance end, reasonable use notes, and cascade settings based on the specific situation.
JPA one-to-multiple bidirectional association query
Add fetch = FetchType. EAGER after cascade = CascadeTpe. ALL to actively capture ing classes.
How to configure multiple-to-multiple relationship bidirectional for Hibernate
Users Pojo:
Public Set popedom = new HashSet ();
Public Set getPopedom (){
Return popedom;
}
Public void setPopedom (Set popedom ){
This. popedom = popedom;
}
Users ing file:
<Set name = "Popedom" table = "Users_Popedom">
<Key column = "UsersId"/>
<Your-to-register class = "com. seipher. pojo. systemSet. Popedom" column = "PopedomId"/>
</Set>
==========================================================
Pojo of Popedom:
Public Set UsersManage = new HashSet ();
Public Set getUsersManage (){
Return UsersManage;
}
Public void setUsersManage (Set usersManage ){
UsersManage = usersManage;
}
Popedom ing file:
<Set name = "UsersManage" table = "Users_Popedom">
<Key column = "PopedomId"/>
<Role-to-register class = "com. seipher. pojo. systemSet. UsersManage" column = "UsersId"/>
</Set>
These two are not the many-to-many bidirectional relationship of hibernate? Many-to-many, and two-way supervision.
Code operation:
/**
* Add permissions to users, that is, the relationship between users and permissions.
*
* @ Param yhxxid
* @ Param xtqxid
*/
Public void setPopedom (String yhxxid, String [] xtqxid) throws HibernateException {
Session = HibernateSession. hdSession ();
UsersManage usersManage = (UsersManage) this. load (yhxxid );
UsersManage. getPopedom (). clear ();
List result = new ArrayList ();
For (int I = 0; I <xtqxid. length; I ++ ){
... The remaining full text>