`
Supanccy2013
  • 浏览: 223783 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

hibernate 基于cglib的 事务代理

阅读更多
    实例:使用hibernate 事务代理完成一个事务,添加一个人,这个人有两个地址。这是一个事务,要么全部插进去,要么谁也不插进去。

1,Person类
package com.dd.domain;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Person {
	private int id;
	private String name;
	private int age;
    private Set<Address> addresss = new HashSet<Address>();
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Set<Address> getAddresss() {
		return addresss;
	}
	public void setAddresss(Set<Address> addresss) {
		this.addresss = addresss;
	}
}


Person类的映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="true" default-access="property" package="com.dd.domain" >
    <class name="Person" dynamic-update="true" dynamic-insert="true" table="myperson">
        <id name="id" column="id" type="integer">
            <generator class="native"/>
        </id>
        <property name="name" type="string" column="name" length="20"/>
        <property name="age" type="integer" column="age" length="3"/>
        <set name="addresss" inverse="true" cascade="all" >
             <key column="personid"/>
             <one-to-many class="Address"/>
        </set>
    </class>
</hibernate-mapping>


2,Address类
package com.dd.domain;
public class Address {
	private int id;
	private String name;
	private String info;
    private String remark;
    private Person person;
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	public String getRemark() {
		return remark;
	}
	public void setRemark(String remark) {
		this.remark = remark;
	}
}

Address类映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-lazy="true" default-access="property" package="com.dd.domain" >
    <class name="Address" dynamic-update="true" dynamic-insert="true" table="address">
        <id name="id" column="id" type="integer">
            <generator class="native"/>
        </id>
        <property name="name" type="string" column="NAME" length="20"/>
        <property name="info" type="string" column="INFO" length="30"/>
        <property name="remark" type="string" column="REMARK" length="30"/>
        <many-to-one name="person" class="Person" column="personid" not-null="true"></many-to-one>
    </class>
</hibernate-mapping>

4,Sprping配置文件
    <!-- Person业务类的事务代理,业务中实际用的是这个代理类 -->
    <bean id="myPersonServiceProxy" parent="baseTransactionProxy">
    <property name="target">
       <ref bean="personService"/>
    </property>
    </bean> 
    
    <!-- 真是的PersonService类,实际业务中没有用到这个类,而是这个类的代理类 -->
    <bean id="personService" class="com.dd.service.PersonServiceImpl">
        <property name="personDao" ref="personDao2"></property>
        <property name="addressDao" ref="addressDaoImp"></property>
    </bean>
    
    <!-- Person的数据库访问类 -->
    <bean id="personDao2" class="com.dd.dao.PersonDaoImpl">
         <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    
    <!-- 添加Person的Action类,注意这个类用的是sping生成的,而不是struts生成的 -->
    <bean id="addMyPerson" class="com.dd.action.AddPersonAction">
         <property name="personService" ref="myPersonServiceProxy"></property>
    </bean>
    
    <!-- 添加地址的数据库访问类 -->
    <bean id="addressDaoImp" class="com.dd.dao.AddressDaoImp">
         <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>


4,Person的Action类
package com.dd.action;
import com.dd.domain.Person;
import com.dd.service.PersonServiceImpl;
public class AddPersonAction {
	private PersonServiceImpl personService;
	private int number1;
	private int number2;
	private int sum;
	public int getNumber1() {
		return number1;
	}
	public void setNumber1(int number1) {
		this.number1 = number1;
	}
	public int getNumber2() {
		return number2;
	}
	public void setNumber2(int number2) {
		this.number2 = number2;
	}
	public int getSum() {
		return sum;
	}
	public void setSum(int sum) {
		this.sum = sum;
	}
	public String add(){
		Person person  = new Person();
		person.setName("陈超样");
		person.setAge(27);
		getPersonService().addPerson(person);
		return "success";
	}
	public PersonServiceImpl getPersonService() {
		return personService;
	}
	public void setPersonService(PersonServiceImpl personService) {
		this.personService = personService;
	}
}


5,Person的业务Service类
package com.dd.service;

import com.dd.dao.AddressDaoImp;
import com.dd.dao.PersonDaoImpl;
import com.dd.domain.Address;
import com.dd.domain.Person;

public class PersonServiceImpl {
	private PersonDaoImpl personDao;
	private AddressDaoImp addressDao;
	public void addPerson(Person person)
	{
		Address address = new Address();
		address.setName("美国");
		address.setInfo("非常富有");
		getPersonDao().addPerson(person);
		getAddressDao().addAddress(address);
	}
	public PersonDaoImpl getPersonDao() {
		return personDao;
	}
	public void setPersonDao(PersonDaoImpl personDao) {
		this.personDao = personDao;
	}
	public AddressDaoImp getAddressDao() {
		return addressDao;
	}
	public void setAddressDao(AddressDaoImp addressDao) {
		this.addressDao = addressDao;
	}
}


6,Person数据库访问类
package com.dd.dao;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.dd.domain.Person;

public class PersonDaoImpl extends HibernateDaoSupport {
	
	public void addPerson(Person person){
		
		getHibernateTemplate().save(person);
		
	}
}


7,Address数据库访问类
package com.dd.dao;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.dd.domain.Address;
public class AddressDaoImp extends HibernateDaoSupport {
	public void addAddress(Address address)
	{
		getHibernateTemplate().save(address);
	}
}


8,添加人员的jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
  
   <s:form action="addMyPerson">
       <s:textfield name="username" key="user"></s:textfield>
       <s:textfield name="password" key="pass"></s:textfield>
       <input type="button"  value="注册"/>
       <s:submit  value="添加"></s:submit>
    </s:form>
  </body>
</html>



分享到:
评论

相关推荐

    cglib动态代理jar包

    CGlib的工作原理基于Java的反射机制和字节码操作。当目标类不支持接口时,CGlib可以创建目标类的子类,并在子类中拦截方法调用,从而实现动态代理。具体步骤如下: 1. 创建Enhancer对象:这是CGlib的核心类,它可以...

    CGlib动态代理类的jar包

    CGlib是Java动态代理的一种实现方式,它不是依赖于Java的反射机制,而是通过生成目标类的子类来实现代理,因此在性能上通常优于基于接口的JDK动态代理。 CGlib动态代理的核心类包括`Enhancer`、`Callback`和`...

    cglib代理jar包

    CGlib代理的工作原理是基于ASM库来生成子类并动态加载到内存中,当调用方法时,实际上是调用了被代理对象的方法。CGlib代理的创建过程主要包括以下几个步骤: 1. 创建Enhancer对象,它是CGlib的核心类,用于设置回...

    Hibernate底层技术简介 CGLIB

    这在Hibernate中非常有用,因为它允许动态生成实体类的代理,以便于实现懒加载、事务管理等特性。例如,你可以创建一个接口`Teller`,然后通过Enhancer和`MethodInterceptor`的实现,如`EchoCaller`,来拦截并处理`...

    cglib动态代理.zip

    CGlib广泛应用于Spring AOP(面向切面编程)中,Spring使用它来创建AOP代理,实现事务管理、日志记录等切面功能。此外,它也常用于ORM框架如Hibernate中,为实体类提供透明的代理,以实现懒加载和其他高级特性。 ...

    Cglib动态代理

    JDK的动态代理基于接口,如果目标类没有实现任何接口,就无法使用JDK的动态代理。而Cglib则解决了这个问题,它不依赖于接口,而是通过生成目标类的子类来实现动态代理。 **Cglib的核心组件** 1. **Enhancer**:这...

    Cglib3.3.0最新版jar包

    Cglib基于ASM库,能够在字节码层面操作Java类,通过生成子类来实现对目标类的扩展,而无需修改源代码。这种方法尤其适用于那些不支持接口或无法修改源代码的类。 2. **动态代理**:动态代理是Java中一个重要的概念...

    深入浅出CGlib-打造无入侵的类代理 - llying - ITeye技术网站

    首先,CGlib是一个基于ASM库的动态代理实现。ASM是一个字节码操作和分析框架,允许程序员生成和修改Java类和字节码。CGlib通过ASM在运行时创建新的子类,而不是接口的实现,来实现对目标对象的代理。这种方法使得...

    Cglib所需要的jar包

    这种方式比基于Java反射API的动态代理更高效,因为反射需要在运行时查找方法,而Cglib直接通过字节码操作实现。 在实际开发中,Cglib常用于AOP(面向切面编程)框架,例如Spring AOP。通过Cglib,Spring可以在不...

    day39-Spring 04-CGLIB的动态代理

    CGLIB被广泛应用于Spring AOP(面向切面编程)中,用于实现对目标对象的动态代理,以提供方法拦截、事务管理、性能监控等功能。 首先,我们要理解什么是动态代理。在Java中,动态代理是一种在运行时创建代理类的...

    CGLib和ASM相关jar包

    JDK的代理机制基于接口,而CGLib则通过继承实现,因此对于未实现接口的类,CGLib是更好的选择。 在实际项目中,CGLib常被用于AOP(面向切面编程)框架,如Spring。AOP允许开发者定义“切面”,即关注点的模块化,...

    Cglib所需的jar包

    在实际应用中,Cglib常与Spring AOP结合使用,为非接口类提供代理服务,实现事务管理、日志记录等切面功能。此外,它也被许多ORM框架如Hibernate采用,用来动态生成持久化对象的子类,以便于实现懒加载和其他优化...

    Cglib和ASM打包合集

    在实际应用中,比如在AOP(面向切面编程)中,Cglib常被用来生成代理对象,以便在方法执行前后插入额外的逻辑,如日志记录、性能监控、事务管理等。此外,它也在ORM框架(如Hibernate)中用于动态生成持久化类的代理...

    java动态代理(JDK和cglib)共10页.pdf.zip

    - 如果目标类实现了接口,优先选择JDK动态代理,因为它是基于接口的,性能较好,且无需引入额外的库。 - 若目标类没有实现接口,或者需要对非接口方法进行代理,那么CGLIB是更好的选择。 6. **应用场景**: - ...

    spring基于AOP实现事务

    2. **定义事务代理**:然后,我们创建一个TransactionProxyFactoryBean实例,指定目标对象(需要事务管理的业务对象)和事务属性。 ```xml *"&gt;PROPAGATION_REQUIRED, -java.lang.Exception ``` 这里...

    hibernate必要的jar包

    8. **cglib-nodep.jar**或**asm.jar**:这两个库之一通常用于为没有接口的类创建代理对象,这是Hibernate动态生成代理类的一种方式。 9. **antlr.jar**:ANTLR是一个强大的解析器生成器,Hibernate使用它来解析HQL...

    Hibernate入门jar包

    - `cglib-nodep.jar`和`asm.jar`:这两个库通常用于动态代理和字节码操作,Hibernate在处理实体类的动态代理时可能会用到。 - `dom4j.jar`或`jdom.jar`:XML处理库,Hibernate的HQL查询结果集转换为XML时会用到。 ...

    hibernate+spring复习大纲

    6. **Spring AOP代理**: 可以创建JDK动态代理或CGLIB代理,实现AOP功能。 7. **Spring Boot**: 快速启动的微服务框架,简化配置,开箱即用。 ### Hibernate与Spring整合 1. **Spring管理Hibernate Session**: 使用`...

    hibernate_jar包

    - cglib和asm:用于动态代理和字节码操作,支持对未实现接口的类进行扩展。 - JTA(Java Transaction API):提供跨应用服务器的事务管理。 - 其他辅助库:如dom4j、ehcache等,分别用于XML处理和二级缓存。 **5. ...

    hibernate所需的jar包

    4. ** cglib-nodep.jar**: 代码生成库,Hibernate在无法获取类的元数据时(例如,针对未继承Hibernate的实体类),会使用CGLIB生成代理类。 5. **asm.jar**: 字节码处理库,与CGLIB配合,用于动态生成字节码。 6. **...

Global site tag (gtag.js) - Google Analytics