深入研究Hibernate之三:一对多的双向

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.yanglg.hibernate.domain">
	<class name="Classroom" table="t_classroom">
		<id name="id">
			<generator class="native"></generator>
		</id>

		<property name="name" length="20" />
		<property name="classno" length="30" />

		<set name="stus" lazy="extra" inverse="true">
			<key column="cid" />
			<one-to-many class="Student" />
		</set>

	</class>
</hibernate-mapping>

Classroom实体类:

package org.yanglg.hibernate.domain;

import java.util.HashSet;
import java.util.Set;

public class Classroom {
	private int id;
	private String name;
	private String classno;

	private Set<Student> stus;

	public Classroom() {
		setStus(new HashSet<Student>());
	}

	public void addStudent(Student student) {
		stus.add(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 String getClassno() {
		return classno;
	}

	public void setClassno(String classno) {
		this.classno = classno;
	}

	public Set<Student> getStus() {
		return stus;
	}

	public void setStus(Set<Student> stus) {
		this.stus = stus;
	}

}

			Classroom c = new Classroom();
			c.setName("09wb");
			c.setClassno("200912");

			Student s1 = new Student();
			s1.setName("name001");
			s1.setIdcard("234");

			Student s2 = new Student();
			s2.setName("name002");
			s2.setIdcard("234333");

			c.addStudent(s1);
			c.addStudent(s2);

			
			session.save(s1);
			session.save(s2);
			session.save(c);

这样:若没有inverse="true",则发如下sql

Hibernate: select hibernate_sequence.nextval from dual

Hibernate: insert into t_student (name, idcard, cid, id) values (?, ?, ?, ?)

Hibernate: insert into t_student (name, idcard, cid, id) values (?, ?, ?, ?)

Hibernate: insert into t_classroom (name, classno, id) values (?, ?, ?)

Hibernate: update t_student set cid=? where id=?

Hibernate: update t_student set cid=? where id=?

三条插入,两条更新,这和manytoone的时候意思是一样的

<set name="stus" lazy="extra" inverse="true">

<key column="cid" />

<one-to-many class="Student" />

</set>

若是加上inverse="true"

Sql:

Hibernate: select hibernate_sequence.nextval from dual

Hibernate: insert into t_student (name, idcard, cid, id) values (?, ?, ?, ?)

Hibernate: insert into t_student (name, idcard, cid, id) values (?, ?, ?, ?)

Hibernate: insert into t_classroom (name, classno, id) values (?, ?, ?)

此时数据库的存储会不对!!!!!!!!

inverse="true"明确表示一的一端不维护关系

若你加上inverse="true"還要用一的一端来维护关系,那么对不起,等着出错吧!!

总上所述:

1、若映射为单向,many-to-one要优于one-to-many,原因很明显,用一的一端来维护关系比较麻烦

2、Save对象时,要先save一的一端,然后在save多的一端(设置其一的一端的属性)

3、加上inverse时,莫要再用一的一端来维护关系,会出错的!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值