多对多双向外键关联
1、 在单项多对多的基础上,对另一方也加上对象的集合引用并在其get方法上加上@manyToMany
2、在上篇说了中间表的名称和字段名称都可以修改但是要注意mappedBy和@JoinTable是互斥的,也就是说,@"关联关系注解"里面写了mappedBy属性,下面就不能再写@JoinTable。否则,Hibernate报异常。
1、创建Teacher类
package cn.yinghuo.model;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import org.hibernate.annotations.GenericGenerator;
/**
* 多对多双向外键关联
*
*/
@Entity
public class Teacher2 {
public String tid;
public String tname;
public Set<Student2> student2 = new HashSet<>();
@ManyToMany
@JoinTable(name="t2_s2",
joinColumns={@JoinColumn(name="tid")},
inverseJoinColumns={@JoinColumn(name="sid")}
)
public Set<Student2> getStudent2() {
return student2;
}
public void setStudent2(Set<Student2> student2) {
this.student2 = student2;
}
@Id
@GeneratedValue(generator="uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
}
2、创建Student类
package cn.yinghuo.model;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import org.hibernate.annotations.GenericGenerator;
/**
* 多对多双向外键关联
*
*/
@Entity
public class Student2 {
public String sid;
public String sname;
public Set<Teacher2> teacher2 = new HashSet<>();
@ManyToMany
@JoinTable(name="t2_s2",
joinColumns={@JoinColumn(name="sid")},
inverseJoinColumns={@JoinColumn(name="tid")}
)
public Set<Teacher2> getTeacher2() {
return teacher2;
}
public void setTeacher2(Set<Teacher2> teacher2){
this.teacher2 = teacher2;
}
@Id
@GeneratedValue(generator="uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
}
3、创建测试类
package cn.yinghuo.action;
/**
* 测试类
*/
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class Main {
public static void main(String[] args) {
schemaExport();
}
// schemaExport()生成数据库表
// 第一个true是在控制台打印出DDL,如果是false没什么影响只是不再打印出DDL(数据库定义语言)
// 第二个true是创建表,反之false则不创建
public static void schemaExport() {
new SchemaExport(new Configuration().configure()).create(true, true);
}
}
4、在XML引入映射文件
5、查看数据库(查看模型)
注意:我用的是@JoinTable没有用mappedBy所以两个类种都要有@JoinTable如果一个类中用@JoinTable另一个用mappedBy也会生成中间表,但是查看模型时看不出图中的连线关系。
使用@JoinTable还需要注意一点name=“tablename"两个类中的tablename要写相同不然就会产生2个中间表