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。
说明:
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。
相关文章推荐
- ssh学习:hibernate关系映射(4)
- Hibernate 学习笔记 之 一对多关系 及其 级联操作
- ssh学习:hibernate关系映射(3)
- ssh学习:hibernate关系映射(1)
- Hibernate学习---第十六节:cascade(级联)和inverse关系详解
- Hibernate学习-14:实体之间的关系及其配置,级联操作
- SSH学习四 Hibernate多对一的关系 + 增删改查
- SSH之hibernate学习笔记----关系映射
- SSH与SSM学习之hibernate18——多对一一对多级联操作
- SSH与SSM学习之hibernate19——多对一一对多关系维护
- SSH与SSM学习之hibernate16——表与表的三种关系
- Hibernate 学习笔记 之 多对多关系 及其 级联操作
- ssh学习:hibernate关系映射(2)
- ssh学习:hibernate关系映射(5)
- Hibernate学习_014_级联关系中的CRUD操作
- SSH学习---Spring中常用的hql查询方法(getHibernateTemplate())(转载)
- hibernate 级联删除时候的两种情况 之(二) 删除从表,无法删除关系表
- Hibernate的学习总结(映射类之间的继承关系)
- SSH整合学习笔记之spring与hibernate整合(二)--C3P0
- SSH整合学习笔记之spring与hibernate简单整合.doc