hibernate学习4之one-to-many单向关联(不推荐)
来源:互联网 发布:李米的猜想知乎 编辑:程序博客网 时间:2024/06/17 17:27
一对多和多对一的映射策略是一样的,只是站的角度不同.
多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多
先上配置文件:
Student.hbm.xml:
Classes.hbm.xml:
上面这个配置在Student一端加入了一个classesid外键;也说明set里存放的是Student对象
测试一下:
在一一端维护关系的缺点:
* 如果将t_student表里的classesid字段设置为非空,则无法保存
* 因为不是在student这一端维护关系,所以student不知道是哪个班的,
所以需要发出多余的update语句来更新关系
因为一对多(单向关联)会发出额外的sql语句,效率没有多对一高,所以通常情况下不采用一对多的单向关联,采用双向关联比较妥当!
多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多
先上配置文件:
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_one2many_1</property><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">bjsxt</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><property name="hibernate.show_sql">true</property><mapping resource="com/bjsxt/hibernate/Classes.hbm.xml"/><mapping resource="com/bjsxt/hibernate/Student.hbm.xml"/></session-factory></hibernate-configuration>
public class Student {private int id;private String name;//setter,getter}
import java.util.Set;public class Classes {private int id;private String name;private Set students; //一对多,一个班级对应很多学生//setter,getter}
Student.hbm.xml:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.bjsxt.hibernate.Student" table="t_student"><id name="id"><generator class="native"/></id><property name="name"/></class></hibernate-mapping>
Classes.hbm.xml:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.bjsxt.hibernate.Classes" table="t_classes"><id name="id"><generator class="native"/></id><property name="name"/><set name="students"><key column="classesid"/><one-to-many class="com.bjsxt.hibernate.Student"/></set></class></hibernate-mapping>
上面这个配置在Student一端加入了一个classesid外键;也说明set里存放的是Student对象
测试一下:
import java.util.HashSet;import java.util.Iterator;import java.util.Set;import junit.framework.TestCase;import org.hibernate.Session;public class One2ManyTest extends TestCase {public void testSave1() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();Student student1 = new Student();student1.setName("10");session.save(student1);//先saveStudent student2 = new Student();student2.setName("祖儿");session.save(student2);//先saveSet students = new HashSet();students.add(student1);students.add(student2);Classes classes = new Classes();classes.setName("尚学堂");classes.setStudents(students);//可以正确保存session.save(classes);session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {HibernateUtils.closeSession(session);}}public void testLoad1() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();Classes classes = (Classes)session.load(Classes.class, 1);System.out.println("classes.name=" + classes.getName());Set students = classes.getStudents();for (Iterator iter=students.iterator(); iter.hasNext();) {Student student = (Student)iter.next();System.out.println("student.name=" + student.getName());}session.getTransaction().commit();}catch(Exception e) {e.printStackTrace();session.getTransaction().rollback();}finally {HibernateUtils.closeSession(session);}}}
在一一端维护关系的缺点:
* 如果将t_student表里的classesid字段设置为非空,则无法保存
* 因为不是在student这一端维护关系,所以student不知道是哪个班的,
所以需要发出多余的update语句来更新关系
因为一对多(单向关联)会发出额外的sql语句,效率没有多对一高,所以通常情况下不采用一对多的单向关联,采用双向关联比较妥当!
0 0
- hibernate学习4之one-to-many单向关联(不推荐)
- hibernate学习6之many-to-many单向关联
- 码农小汪-Hibernate学习4-关联关系映射many-to-one,many-to-one,one-to-many
- hibernate学习5之one-to-many双向关联
- hibernate学习5之one-to-many双向关联
- Hibernate单向一对多关联(Unidirectional One-To-Many)要点
- hibernate 多对一(Many-to-one)单向关联
- hibernate 单向many to one
- Hibernate 之many-to-one 单向多对一关联示例
- many-to-one单向关联映射
- one-to-many单向关联映射
- Hibernate学习笔记(4)Hibernate映射文件之many-to-many(多对多关联)
- hibernate学习2之many-to-one
- hibernate 单向many-to-one association (2)
- hibernate 单向one-to-many association(1)
- hibernate 单向one-to-many association
- Hibernate one-to-many many-to-one 双向关联
- Hibernate框架之关联关系(many-to-one)
- ASP.Net Ajax框架 和ScriptMnager控件 调用Web Service
- hibernate学习1之基础工具
- hibernate学习2之many-to-one
- 正则表达式的懒惰匹配和前瞻等
- hibernate学习3之one-to-one单向外键关联
- hibernate学习4之one-to-many单向关联(不推荐)
- 本地/局域网 运行showRunApi
- MacOS下homebrew方式安装Apache24、php7、Mysql
- 对ArrayList进行排序的两种方式
- train data 和 model bias 对 Mutilayer Perceptrons 的影响
- hibernate学习5之one-to-many双向关联
- 344. Reverse String
- hibernate学习6之many-to-many单向关联
- shell echo命令