您的位置:首页 > 其它

hibernate级联关系(SSH学习第2天)

2014-06-08 21:44 357 查看
数据对象之间的关联关系有一对一,一对多及多对多三种。在数据库操作中,数据对象之间的关联关系使用JDBC处理很困难。例如,当删除一个班级的信息时,还要删除该班级的所有学生的基本信息。如果直接使用JDBC执行这种级联操作,会非常繁锁。Hibernate通过把实体对象之间的关联关系及级联关系在映射文件中声明,比较简单地解决了这类级联操作问题。





说明:

name表示某一个属性,cascade表示级联关系(在保存或更新Customer时会级联的更新Order对象,key指的是所关联的对象的表的外键);

inverse相反的, 这种关联关系到底谁是主控方(一对多的关联关系时通常只多的一方为主控方),谁是被控方。

示例:

1.表结构(Customers与Orders【一对多的关系】)





2.对应的JavaBean

(1)Customers.java

package com.jy;

import java.util.Set;

public class Customers {

private long id;

private String name;

private Set orders;//对应的多种商品设置为集合类型

public Customers(){

}

public Customers(String name,Set orders){

this.name=name;

this.orders=orders;

}

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 Set getOrders() {

return orders;

}

public void setOrders(Set orders) {

this.orders = orders;

}

}

(2)Orders.java

package com.jy;

public class Orders {

private long id;

private String number;

private Customers customers;//再次声明一个顾客的对象

public Orders(String number,Customers customers){

this.number=number;

this.customers=customers;

}

public Orders(){

}

public long getId() {

return id;

}

public void setId(long id) {

this.id = id;

}

public String getNumber() {

return number;

}

public void setNumber(String number) {

this.number = number;

}

public Customers getCustomers() {

return customers;

}

public void setCustomers(Customers customers) {

this.customers = customers;

}

}

3.对应的配置文件





4.测试类(test.java)

package com.jy;

import java.util.HashSet;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

public class Test {

/**

* @param args

*/

public static SessionFactory sessionFactory;

static{

try{

sessionFactory=new Configuration().configure().buildSessionFactory();

}catch(Exception e){

System.out.println("exception occured");

}

}

public static void saveCustomersAndOrdersWithCascade(){

Session session=sessionFactory.openSession();

Transaction tx=null;

try{

tx=session.beginTransaction();

//创建一个顾客示例

Customers customers=new Customers("zhangsan",new HashSet());

Orders orders1=new Orders();

orders1.setNumber("11");

orders1.setCustomers(customers);

Orders orders2=new Orders();

orders2.setNumber("22");

orders2.setCustomers(customers);

Orders orders3=new Orders();

orders3.setNumber("22");

orders3.setCustomers(customers);

//将一对多的关系体现出来

customers.getOrders().add(orders1);

customers.getOrders().add(orders2);

customers.getOrders().add(orders3);

session.save(customers);

}catch(Exception e){

if(null!=tx){

tx.rollback();

}

}finally{

if(null!=tx){

tx.commit();

}

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

saveCustomersAndOrdersWithCascade();

}

}

5.代码补充说明:

Configuration类用来管理我们的配置文件的信息的,通过它,我们可以通过创建一个configuration实例来管理相应的配置文档,但是通常我们只创建一个configuration实例。

这里要说明的是,SessionFactory是线程安全的,可以被多个线程调用。在我们实际开发中,我们可以在初始化的部分构造一个SessionFactory即可,比如,在一个公共静态类中初始化一个SessionFactory的readonly常量等等。它充当数据存储源的代理。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: