一对多实列问题逻辑:
一个student对应多个user账号,通过外键实现
1.student实体类
public class HStudent {
private int sid ;
private String sname ;
private Set<HUser> userSet = new HashSet();
}
2.User实体类
public class HUser {
private int uid ;
private String uname ;
private HStudent student;
}
3.配置映射文件
在user方加入
<many-to-one name="customer" class="bean.Customer" column="clid">
在student方加入
<set name="setLinkMan" cascade="save-update" >
<key column = "clid"></key>//对应外键名
<one-to-many class ="bean.LinkMan"></one-to-many>
//class对应的多的完整路径
</set>
多对多实列问题逻辑:
一个student可以选择多个课程,一个课程可以被多个学生选择
1.学生实体类
public class Student {
private Integer sid;
private String sname;
private Set<Course> courses = new HashSet<Course>();
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
}
2.课程实体类
public class Course {
private Integer cid;
private String cname;
private Set<Student> students = new HashSet<Student>();
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
3.学生映射文件
<?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>
<class name="bean.Student" table="t_student">
<!--一,主键属性 -->
<id name="sid" column="sid">
<generator class="native"></generator>
</id>
<!-- 二,其它属性 -->
<property name="sname" column="sname"/>
<!-- 三,表示和课程的关系 -->
<!--3.1 set标签的name属性:当前类中集合的名字
table:第三方表名
-->
<set name="courses" table="s_c_tab" >
<!--3.2 key的 column表示当前类在中间表中的外键 -->
<key column="sid" not-null="false" />
<!--3.3 many-to-many表示多对多关系
column:表示另一方在中间表中的外键
class:表示另一方类的全限定名
-->
<many-to-many column="cid" class="bean.Course" ></many-to-many>
</set>
</class>
</hibernate-mappin
4.课程映射文件
<?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>
<class name="bean.Course" table="t_course">
<!--一,主键属性 -->
<id name="cid" column="cid">
<generator class="native"></generator>
</id>
<!-- 二,其它属性 -->
<property name="cname" column="cname"/>
<!-- 三,表示和课程的关系 -->
<!--3.1 set标签的name属性:当前类中集合的名字
table:第三方表名
-->
<set name="students" table="s_c_tab" inverse="true"><!--inverse = true 关系维护,基表为course 只有一方放置即可 -->
<!--3.2 key的 column表示当前类在中间表中的外键 -->
<key column="cid" not-null="false"/>
<!--3.3 many-to-many表示多对多关系
column:表示另一方在中间表中的外键
class:表示另一方类的全限定名
-->
<many-to-many column="sid" class="bean.Student"></many-to-many>
</set>
</class>
</hibernate-mapping>
5.测试类
public class TestManytoMany {
public static void test1(){
Session session = DButils.getSession();
Transaction transaction = session.beginTransaction();
Student stu1= new Student();
stu1.setSname("zhang san");
Student stu2 =new Student();
stu2.setSname("li si");
Course c1= new Course();
c1.setCname("english");
Course c2 = new Course();
c2.setCname("french");
Course c3 = new Course();
c3.setCname("math");
stu1.getCourses().add(c1);
stu1.getCourses().add(c2);
stu2.getCourses().add(c2);
stu2.getCourses().add(c3);
c1.getStudents().add(stu1);
c2.getStudents().add(stu1);
c2.getStudents().add(stu2);
c3.getStudents().add(stu2);
session.save(stu1);
session.save(stu2);
session.save(c1);
session.save(c2);
session.save(c3);
DButils.commit(transaction);
}
public static void main(String args[]) throws Exception{
test1();
}
}