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

数据对象之间的关联关系有一对一,一对多及多对多三种。在数据库操作中,数据对象之间的关联关系使用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。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值