项目使用Hibernate作为数据持久层
1、添加Hibernate的依赖,在pom.xml中添加
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <exclusions> <exclusion> <artifactId>cglib</artifactId> <groupId>cglib</groupId> </exclusion> <exclusion> <artifactId>dom4j</artifactId> <groupId>dom4j</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> </dependency>
此项不仅添加了Hibernate还添中对JPA的支持
2、配置Spring对Hibernate的支持,添加的配置文件要在web.xml中能够引用到
添加jdbc.properties,用于保存数据库连接以及Hibernate各项参数
#dataSource for oracle oracle.driverClass=oracle.jdbc.driver.OracleDriver oracle.url=jdbc:oracle:thin:@localhost:1521:TRAIN oracle.username=train oracle.password=train oracle.maxIdle=1 oracle.maxActive=10 oracle.dialect=pine.core.hibernate.dialect.Oracle10gDialect oracle.show_sql=true oracle.generateDdl=false oracle.hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider oracle.hibernate.cache.use_second_level_cache=false oracle.hibernate.max_fetch_depth=2
添加applicationContext-resources.xml,注册datasource对象
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:context="http://www.springframework.org/schema/context" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:security="http://www.springframework.org/schema/security" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> <!-- PropertyConfigurer for the dataSource --> <context:property-placeholder location="classpath:jdbc.properties" /> <bean id="OracleDS" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${oracle.driverClass}" /> <property name="url" value="${oracle.url}" /> <property name="username" value="${oracle.username}" /> <property name="password" value="${oracle.password}" /> <property name="maxIdle" value="${oracle.maxIdle}" /> <property name="maxActive" value="${oracle.maxActive}" /> </bean> </beans>
添加applicationContext-common.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:context="http://www.springframework.org/schema/context" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:security="http://www.springframework.org/schema/security" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> <!-- PropertyConfigurer for the dataSource --> <context:property-placeholder location="classpath:jdbc.properties" /> <context:annotation-config /> <aop:aspectj-autoproxy /> <tx:annotation-driven transaction-manager="transactionManager" /> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="list*" read-only="true" /> <tx:method name="*" read-only="false" rollback-for="RollBackAppException"/> </tx:attributes> </tx:advice> <aop:config> <aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Service.*(..))" order="2"/> </aop:config> <context:component-scan base-package="pine.web.dao"/> <context:component-scan base-package="pine.web.service"/> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="OracleDS" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${oracle.dialect}</prop> <prop key="hibernate.cache.use_second_level_cache">${oracle.hibernate.cache.use_second_level_cache}</prop> <prop key="hibernate.cache.provider_class">${oracle.hibernate.cache.provider_class}</prop> <prop key="hibernate.max_fetch_depth">${oracle.hibernate.max_fetch_depth}</prop> <prop key="hibernate.show_sql">${oracle.show_sql}</prop> </props> </property> <property name="packagesToScan"> <list> <value>pine.web.model</value> </list> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> </beans>
3、创建表
create table SYS_USER ( ID NUMBER not null primary key, USERNAME VARCHAR2(50), PASSWORD VARCHAR2(50), FULLNAME VARCHAR2(100), DEPARTMENT_ID NUMBER )
4、创建实体类
@Entity @Table(name="SYS_USER") public class User implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_USER") @SequenceGenerator(name="SEQ_USER", sequenceName="SEQ_USER") private Long id; private String username; private String password; private String fullname; ......(各种get,set方法) }
5、创建Dao
创建系统基础DAO类AbstractHibernateDao
public abstract class AbstractHibernateDao extends HibernateDaoSupport { @Resource(name="sessionFactory") public void setSuperSessionFactory(SessionFactory sessionFactory){ super.setSessionFactory(sessionFactory); } }
创建基础DAO接口,只提供了部分方法
public interface BaseDao<T> { public void save(T t); public T get(Serializable id); public T load(Serializable id); public void delete(Serializable id); public void delete(T t); public void delete(T t, LockMode lockMode); public void deleteAll(Collection<T> entities); }
创建基础DAO接口实现类
public abstract class BaseDaoImpl<T> extends AbstractHibernateDao implements BaseDao<T> { private Logger log = Logger.getLogger(BaseDaoImpl.class); protected abstract Class<T> getEntityClass(); public void save(T t) { getHibernateTemplate().save(t); }; @Override public T get(Serializable id) { return getHibernateTemplate().get(getEntityClass(), id); } @Override public T load(Serializable id) { T ob = null; try { ob = getHibernateTemplate().load(getEntityClass(), id); } catch (RuntimeException e) { if(log.isDebugEnabled()) log.debug("can't load entity by primary key", e); } if (ob == null) return get(id); return null; } @Override public void delete(Serializable id) { T ob = load(id); if (ob == null) { if(log.isDebugEnabled()) log.debug("can't delete entity by primary key:"+getEntityClass().getName()+"."+id+",object is not exist!"); return; } getHibernateTemplate().delete(ob); } @Override public void delete(T t) { getHibernateTemplate().delete(t); } @Override public void delete(T t, org.hibernate.LockMode lockMode) { getHibernateTemplate().delete(t, lockMode); } @Override public void deleteAll(Collection<T> entities) { getHibernateTemplate().deleteAll(entities); } }
创建UserDao,UserDaoImpl,UserService,UserServiceImpl各种类
@Service("UserService") public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public void save(User user) { this.userDao.save(user); } @Override public void test() { User user = new User(); user.setId(1L); user.setUsername("gmm"); user.setPassword("admin"); user.setFullname("龚敏"); save(user); } }
5、测试一下