一、双向一对多映射
多的一方:student.hbm.xml
<many-to-one name="c" column="classId" class="com.gw.model.Class" cascade="save-update"></many-to-one>
单的一方:class.hbm.xml
<set name="students" cascade="save-update" >
<key column="classId"></key>
<one-to-many class="com.gw.model.Student"/>
</set>
test:
@Test
public void test() {
Class c= new Class();
c.setName("学前班sss");
Student s1 = new Student();
s1.setName("张三");
Student s2 = new Student();
s2.setName("李四");
c.getStudents().add(s1);
c.getStudents().add(s2);
session.save(c);
}
@Test
public void getStudentsByClass(){
Class c = (Class)session.get(Class.class, Long.valueOf(7));
Set<Student> students = c.getStudents();
Iterator it = students.iterator();
while(it.hasNext()){
Student s =(Student)it.next();
System.out.println(s);
}
}
二、inverse属性
@Test
public void testAdd(){
Class c =new Class();
c.setName("16网工");
Student s1 = new Student();
s1.setName("王五");
session.save(c);
session.save(s1);
}
以上这种方法 生成的数据之间不会产生关联
@Test
public void testInverse(){//冗余
Class c=(Class)session.get(Class.class, Long.valueOf(1));
Student s=(Student)session.get(Student.class, Long.valueOf(1));
s.setC(c);
c.getStudents().add(s);
}
以上这种方法,两条数据会产生关联,但是会执行两条Update语句遭成冗余
为了解决这种情况 需要在 one的一方加上 inverse="true"
<set name="students" cascade="save-update" inverse="true">
<key column="classId"></key>
<one-to-many class="com.gw.model.Student"/>
</set>
这样每次执行上述方法都只会产生一条Sql语句
三、级联删除
但两个表格中的数据互相有关联,此时删除其中一个会产生数据错误,于是就引入了级联删除
级联删除需要在 one的一方 加入 cascade="delete"
<set name="students" cascade="delete" inverse="true">
<key column="classId"></key>
<one-to-many class="com.gw.model.Student"/>
</set>
test:
@Test
public void testDeleteClassCascade(){
Class c=(Class)session.get(Class.class, Long.valueOf(1));
session.delete(c);
}
这样就会删除学生所有班级ID为1的数据,但这种方法存在大量风险,所以不推荐!
四、一对多双向映射
model:
public class Node {
private long id;
private String name;
private Node parentNode;
private Set<Node> childNodes = new HashSet<Node>();
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Node getParentNode() {
return parentNode;
}
public void setParentNode(Node parentNode) {
this.parentNode = parentNode;
}
public Set<Node> getChildNodes() {
return childNodes;
}
public void setChildNodes(Set<Node> childNodes) {
this.childNodes = childNodes;
}
}
Node.hbm.xml:
<hibernate-mapping package="com.gw.model">
<class name="Node" table="t_node">
<id name="id" column="nodeId">
<generator class="native"></generator>
</id>
<property name="name" column="nodeName"></property>
<many-to-one name="parentNode" column="parentId" class="com.gw.model.Node" cascade="save-update"></many-to-one>
<set name="childNodes" inverse="true">
<key column="parentId"></key>
<one-to-many class="com.gw.model.Node"/>
</set>
</class>
</hibernate-mapping>
@Test
public void testSaveMenu(){
Node node = new Node();
node.setName("根节点");
Node subNode1 = new Node();
subNode1.setName("子节点");
Node subNode2 = new Node();
subNode2.setName("子节点");
subNode1.setParentNode(node);
subNode2.setParentNode(node);
session.save(subNode1);
session.save(subNode2);
}