teacher-studentdemo–注解法
注:
1teacher与student多对多
2由类生成表
问题
1如何生成中间表
2如何描述teacher与中间表关系
@JoinTable(name=“s_t”,joinColumns= {@JoinColumn(name=“c_teacher_id”,referencedColumnName = “id”)},inverseJoinColumns = {@JoinColumn(name=“student_id”)})
3teacher和student 谁放弃维护
student放弃,讲控制权交给students, students是 teacher中的private Set students=new HashSet();
@ManyToMany(targetEntity = Teacher.class,mappedBy = “students”)
4级联关系
teacher和student是否都需要
本demo中 只在teacher中加了级联
@Cascade(CascadeType.SAVE_UPDATE)
总
teacher中
多对多关系
生成中间表
级联关系saveupdate
student中
多对多关系
放弃维护,交给students
test中
从teacher角度
teacher关联students
t1.getStudents().add(s1);
t2.getStudents().add(s2);
保存teacher
注意:id 嗯 没了
下面是代码
teacher类
package cn.hgu.domain;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
@Entity
@Table(name="t_teacher",catalog = "student")
public class Teacher {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
想要生成中间表s_t
//@JoinTable 描述中间表,描述外键 student与teacher的关联
//joinColumns描述teacher表与中间表的映射
@ManyToMany(targetEntity = Student.class)
@JoinTable(name="s_t",joinColumns= {@JoinColumn(name="c_teacher_id",referencedColumnName = "id")},inverseJoinColumns = {@JoinColumn(name="student_id")})
@Cascade(CascadeType.SAVE_UPDATE)
private Set<Student> students=new HashSet<Student>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
Student类
package cn.hgu.domain;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="t_student",catalog = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@ManyToMany(targetEntity = Teacher.class,mappedBy = "students")
private Set<Teacher> teachers=new HashSet<Teacher>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
}
test
package cn.hgu.domain;
import org.hibernate.Session;
import cn.hgu.util.HbnUtil;
public class Test3 {
public static void main(String[] args) {
Session session = HbnUtil.getSession();
try{
session.beginTransaction();
//建立2个teacher、2个student
Teacher t1=new Teacher();
Teacher t2=new Teacher();
t1.setId(1);
t1.setName("zang");
t2.setId(2);
t2.setName("huang");
Student s1=new Student();
Student s2=new Student();
//stu关联tea
s1.getTeachers().add(t1);
s2.getTeachers().add(t2);
//tea关联stu
t1.getStudents().add(s1);
t2.getStudents().add(s2);
//1保存laos
session.save(t1);
session.save(t2);
session.getTransaction().commit();
}catch(Exception ex){
ex.printStackTrace();
session.getTransaction().rollback();
}
}
}
hibernate.cfg
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 连接四要素 -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/student?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">12345678</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<mapping class="cn.hgu.domain.Student"/>
<mapping class="cn.hgu.domain.Teacher"/>
</session-factory>
</hibernate-configuration>
注:
1hibernate 中
数据库中没有表时用create
有了以后update
create谨慎使用
update
2映射整对,别跑偏了
结果
student-course 配置文件法
配置文件如下
cource
package cn.hgu.many2many;
import java.util.HashSet;
import java.util.Set;
public class Course {
private int cid;
private String cname;
private Set<Student> students=new HashSet<Student>(0);
public int getCid() {
return cid;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
}
student
package cn.hgu.many2many;
import java.util.HashSet;
import java.util.Set;
public class Student {
private int sid;
private String name;
private int age;
private String address;
private Set<Course> coursees=new HashSet<Course>(0);
public Set<Course> getCoursees() {
return coursees;
}
public void setCoursees(Set<Course> coursees) {
this.coursees = coursees;
}
public Student() {}
public Student(int id,String name,int age,String address){
this.sid = id;
this.name= name;
this.age =age;
this.address = address;
}
public Student(String name,int age){
this.name = name;
this.age =age;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "id:"+sid+"\t name:"+name+ "\t age:" +age +"\t address"+address;
}
}
course.hbm
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- sesssion.save(student) ===> insert into student(id,name,age,address) values(student.getId(),student.getName(),student.getAge(),student.getAddress()) =====> -->
<class name="cn.hgu.many2many.Course" table="course">
<id name="cid" column="cid">
<generator class="native"></generator>
</id>
<property name="cname">
<column name="cname"></column>
</property>
<!-- 多对多中间表 select student.* from student where id in(select sid from sc where cid=?) -->
<set name="students" table="sc" cascade="save-update">
<key column="cid"></key>
<many-to-many class="cn.hgu.many2many.Student" column="sid"></many-to-many>
</set>
</class>
</hibernate-mapping>
student.hbm
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- sesssion.save(student) ===> insert into student(id,name,age,address) values(student.getId(),student.getName(),student.getAge(),student.getAddress()) =====> -->
<class name="cn.hgu.many2many.Student" table="student">
<id name="sid" column="sid">
<generator class="native"></generator>
</id>
<property name="name">
<column name="name"></column>
</property>
<property name="age" column="age"></property>
<property name="address" column="address"></property>
<set name="coursees" table="sc" cascade="all">
<key column="sid"></key>
<many-to-many class="cn.hgu.many2many.Course" column="cid"></many-to-many>
</set>
</class>
</hibernate-mapping>
hibernate.cfg
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 连接四要素 -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/student?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">12345678</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- <mapping class="cn.hgu.domain.Student"/>
<mapping class="cn.hgu.domain.Teacher"/> -->
<!-- <mapping class="cn.hgu.domain.Custom"/>
<mapping class="cn.hgu.domain.Order"/> -->
<!-- 加载映射文件 -->
<mapping resource="cn/hgu/many2many/Student.hbm.xml"></mapping>
<mapping resource="cn/hgu/many2many/Course.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>