Hibernate4自学入门(五)——双向一对多、inverse属性、级联删除、一对多双向自身映射

17 篇文章 0 订阅
9 篇文章 0 订阅



一、双向一对多映射

多的一方: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:

	@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);
	}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值