Hibernate一对多:
建立一个便于操作的类:
public class HibernateUtil {
private static SessionFactorysessionfactory;
private static Session session;
static {
//创建配置对象
Configuration config = newConfiguration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建会话工厂对象
sessionfactory = config.buildSessionFactory(serviceRegistry);
}
//获取SessionFactory
public static SessionFactorygetSessionFactory() {
returnsessionfactory;
}
//获取Session
public static SessiongetSession() {
session = sessionfactory.openSession();
returnsession;
}
//关闭Session
public static voidcloseSession(Session session) {
if (session != null) {
session.close();
}
}
}
这个类中的getsession等方法,在最开始生成的HibernateSessionFactory中都有。
在数据库中,可以通过添加主外键的关联,表现一对多的关系。
通过在一方持多方的集合实现,即在“一”的一端中使用《set》元素表示持有“多”的一端的对象
暂时先这样设置:班级类private Set <Student> students = newHashSet<Student>();
班级配置文件<set name="students" inverse="false" table="student">
通过在一方持多方的集合实现,即在“一”的一端中使用《set》元素表示持有“多”的一端的对象
暂时先这样设置:班级类private Set <Student> students = newHashSet<Student>();
班级配置文件<set name="students" inverse="false" table="student">
然后是增删改查:
public class Test {
public static void main(String[] args) {
delete();
}
public static void add() {
Grade g = new Grade("Java一班", "Java软件开发一班");
Student stu1 = new Student("张三", "男");
Student stu2 = new Student("穆女神", "女");
//如果希望在学生表中添加对应的班级编号,需要在班级中添加学生,建立关联关系
g.getStudents().add(stu1);
g.getStudents().add(stu2);
Sessionsession = HibernateUtil.getSession();
Transactiontx = session.beginTransaction();
session.save(g);
session.save(stu1);
session.save(stu2);
tx.commit();
HibernateUtil.closeSession(session);
}
//查询班级中包含的学生
public static voidfindStudentsByGrade() {
Sessionsession = HibernateUtil.getSession();
Gradegrade = (Grade) session.get(Grade.class, 2);
System.out.println(grade.getGname() + "," + grade.getGdesc());
Setstudents = grade.getStudents();
for (Studentstu:
students) {
System.out.println(stu.getSname() + "," + stu.getSex());
}
}
//修改学生信息
public static voidupdate() {
Grade g = newGrade("Java二班", "Java软件开发二班");
Sessionsession = HibernateUtil.getSession();
Transactiontx = session.beginTransaction();
Student stu = (Student) session.get(Student.class, 2);
g.getStudents().add(stu);
session.save(g);
tx.commit();
HibernateUtil.closeSession(session);
}
//删除学生信息
public static voiddelete() {
Sessionsession = HibernateUtil.getSession();
Transactiontx = session.beginTransaction();
Student stu = (Student) session.get(Student.class, 1);
session.delete(stu);
tx.commit();
HibernateUtil.closeSession(session);
}
}
set元素的常用属性
单向多对一关联简介:
多对一的关系和关系数据库中的外键参照关系最匹配,即在己方的表中的一个外键参
照另一个表的主键
通过在多方持有一方的引用实现
通过在多方持有一方的引用实现
private Grade grade;
public Grade getGrade() {
return this.grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
需要在多的一端使用<many-to-one>配置
<many-to-one name="grade" class="Grade" column="gid"cascade="all">
</many-to-one>
双向关联关系:
在一的一方配置:
既是在多和一方均进行配置才能形成双向关联关系。
<many-to-one name="grade" class="Grade" column="gid"cascade="all">
</many-to-one>
双向关联关系:
在一的一方配置:
<set name="students" inverse="false"table="student">
<key>
<column name="gid" />
</key>
<one-to-many class="Student" />
</set>
既是在多和一方均进行配置才能形成双向关联关系。
inverse属性:
《set》节点的inverse属性指定关联关系的控制方向,默认由one方来维护。
关联关系中,inverse="false"这为主动方,由主动方负责维护关联关系。
上面之所以使用flase是因为在保存中没有双向关联:(
g.getStudents().add(stu1);
g.getStudents().add(stu);
stu1.setGrade(g);
stu.setGrade(g);)
使用true,在保存双向关联这样之后数据库在保存数据时就不用在进行数据库的更新啦。
《set》节点的inverse属性指定关联关系的控制方向,默认由one方来维护。
关联关系中,inverse="false"这为主动方,由主动方负责维护关联关系。
上面之所以使用flase是因为在保存中没有双向关联:(
使用true,在保存双向关联这样之后数据库在保存数据时就不用在进行数据库的更新啦。
之前的操作:
改为true时候操作:
通过cascade属性进一步优化:
当设置了cascade属性不为none时,hibernate会自动持久化所关联的对象。
cascade属性的设置会带来性能上的变动,需谨慎设置
cascade属性的设置会带来性能上的变动,需谨慎设置
在班级的set节点中添加cascade="sav-update"表示当进行保存和更新时自动进行级联的操作。
如果在学生配置文件《many toone》中添加cascade="all",这样在进行学生的相关操作时会对班级也进行操作。
信息查询:
public class Test02 {
public static void main(String[] args) {
findGradeByStudent();
}
//保存
public static void save() {
Grade g = new Grade("Java三班", "Java开发三班");
Student stu = new Student("女神", "女");
Student stu1 = newStudent("女神1", "女");
//设置关联关系
g.getStudents().add(stu1);
g.getStudents().add(stu);
stu1.setGrade(g);
stu.setGrade(g);
Sessionsession = HibernateUtil.getSession();
Transactiontx = session.beginTransaction();
session.save(g);
//session.save(stu1);
//session.save(stu);
tx.commit();
HibernateUtil.closeSession(session);
}
//查询学生所在班级的信息
public static void findGradeByStudent() {
Sessionsession = HibernateUtil.getSession();
Student stu = (Student) session.get(Student.class, 2);
System.out.println(stu.getSex() + "" + stu.getSname());
Grade g = stu.getGrade();
System.out.println(g.getGname() + "" + g.getGdesc());
HibernateUtil.closeSession(session);
}
}
其实在开始数据库中创建表格时就添加主键关联:
在通过DB Driver产生映射持久化类的时候,上面的很多操作就已经完成啦。在最后进行保存操作是只需要:
Grade g = new Grade("Java三班", "Java开发三班");
Student stu = new Student("女神","女");
Student stu1 = newStudent("女神1", "女");
//设置关联关系
g.getStudents().add(stu1);
g.getStudents().add(stu);
stu1.setGrade(g);
stu.setGrade(g);
Sessionsession=HibernateUtil.getSession();
Transactiontx=session.beginTransaction();
session.save(g);
tx.commit();
HibernateUtil.closeSession(session);
就能完成。