spring+jpa的整合
数据库文件
/*
Navicat MySQL Data Transfer
Source Server : mysql
Source Server Version : 50165
Source Host : localhost:3306
Source Database : testdb
Target Server Type : MYSQL
Target Server Version : 50165
File Encoding : 65001
Date: 2012-09-11 12:46:12
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `goods`
-- ----------------------------
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods` (
`goodsId` int(11) unsigned NOT NULL AUTO_INCREMENT,
`price` double(10,2) NOT NULL,
`goodName` varchar(20) NOT NULL,
PRIMARY KEY (`goodsId`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of goods
-- ----------------------------
INSERT INTO `goods` VALUES ('1', '1.54', '冰激凌');
INSERT INTO `goods` VALUES ('2', '3.60', '面包');
INSERT INTO `goods` VALUES ('7', '5200.00', 'thinkpad笔记本');
INSERT INTO `goods` VALUES ('8', '5200.00', 'thinkpad笔记本');
实体类
package com.own.entity;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Goods implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int getGoodsId() {
return goodsId;
}
public void setGoodsId(int goodsId) {
this.goodsId = goodsId;
}
public String getGoodName() {
return goodName;
}
public void setGoodName(String goodName) {
this.goodName = goodName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
private int goodsId;
private String goodName;
private double price;
}
泛型dao
package com.own.dao;
import java.io.Serializable;
public interface GenericDao<T extends Serializable,PK extends Serializable> {
/**
* 保存一个对象
* @param obj
*/
void saveObject(T obj);
/**
* 删除一个对象
* @param obj
*/
void deleteObject(T obj);
/**
* 更新一个对象
* @param ojb
*/
void updateObject(T ojb);
/**
* 根据主键id找到一个对象
* @param id
*/
T findObject(PK id);
}
泛型dao的实现
package com.own.dao.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import com.own.dao.GenericDao;
public abstract class GenericDaoImpl<T extends Serializable ,PK extends Serializable> implements GenericDao<T,PK>{
@PersistenceContext
protected EntityManager em;
private Class<T> entityClass;
@SuppressWarnings("unchecked")
public GenericDaoImpl(){
/**
* 获取泛型的实际类型
*/
ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
entityClass = (Class<T>)type.getActualTypeArguments()[0];
}
@Override
public void deleteObject(T obj) {
// TODO Auto-generated method stub
em.remove(em.merge(obj));
}
@Override
public T findObject(PK id) {
// TODO Auto-generated method stub
return (T)em.find(entityClass,id);
}
@Override
public void saveObject(T obj) {
// TODO Auto-generated method stub
em.persist(obj);
}
@Override
public void updateObject(T obj) {
// TODO Auto-generated method stub
em.merge(obj);
}
}
定义一个具体的dao继承泛型dao
package com.own.dao;
import com.own.entity.Goods;
public interface GoodsDao extends GenericDao<Goods,Integer> {
/**
* 添加需要的方法
*/
}
GoodsDao的实现,这里继承泛型dao的实现
package com.own.dao.impl;
import org.springframework.stereotype.Repository;
import com.own.dao.GoodsDao;
import com.own.entity.Goods;
@Repository("goodsDao")
public class GoodsDaoImpl extends GenericDaoImpl<Goods,Integer> implements GoodsDao {
}
GoodsService 代码
package com.own.service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.own.entity.Goods;
public interface GoodsService {
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class)
void saveGoods(Goods goods);
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class)
void removeGoods(Goods goods);
//查找方法不需要配置事务
Goods getGoodsById(int id);
/**
* 配置事务
*
*/
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class)
void updateGoods(Goods goods);
}
Goodsservice实现
package com.own.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.own.dao.GoodsDao;
import com.own.entity.Goods;
import com.own.service.GoodsService;
@Service("goodsService")
public class GoodsServiceImpl implements GoodsService {
@Resource(name="goodsDao")
private GoodsDao goodsDao;
@Override
public Goods getGoodsById(int id) {
// TODO Auto-generated method stub
return goodsDao.findObject(id);
}
@Override
public void removeGoods(Goods goods) {
// TODO Auto-generated method stub
goodsDao.deleteObject(goods);
}
@Override
public void saveGoods(Goods goods) {
// TODO Auto-generated method stub
goodsDao.saveObject(goods);
}
@Override
public void updateGoods(Goods goods) {
// TODO Auto-generated method stub
goodsDao.updateObject(goods);
}
}
测试代码
package com.own.service;
import static org.junit.Assert.*;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.own.entity.Goods;
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class GoodsServiceTest {
@Resource(name="goodsService")
private GoodsService goodsService;
@Test
public void testSaveGoods() {
Goods goods = new Goods();
goods.setGoodName("电视机");
goods.setPrice(2300);
goodsService.saveGoods(goods);
}
@Test
public void testRemoveGoods() {
Goods goods = new Goods();
goods.setGoodsId(2);
//Goods good = (Goods)goodsService.getGoodsById(1);
goodsService.removeGoods(goods);
}
@Test
public void testGetGoodsById() {
Goods good = (Goods)goodsService.getGoodsById(1);
String name = good.getGoodName();
System.out.println(good.getGoodName());
assertEquals("冰激凌",name);
}
@Test
public void testUpdateGoods() {
Goods good = new Goods();
good.setGoodsId(7);
good.setGoodName("巧克力");
goodsService.updateGoods(good);
}
}
spring的配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-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/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">
<!-- 配置连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="root" ></property>
<property name="password" value="zyp" ></property>
<property name="maxActive" value="20" ></property>
<property name="initialSize" value="3" > </property>
<property name="maxWait" value="60000" ></property>
<property name="maxIdle"><value>20</value></property>
<property name="minIdle"><value>0</value></property>
</bean>
<!-- 配置jap实现提供商的特性 -->
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
<property name="database" value="MYSQL" ></property>
</bean>
<!-- 持久化提供商 -->
<bean id="persistenceProvider" class="org.hibernate.ejb.HibernatePersistence"/>
<!--配置spring对jpa的支持 -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
<property name="dataSource">
<ref bean="dataSource" />
</property>
<!-- 持久化单原名称 -->
<property name="persistenceUnitName" value="zyp" />
<!-- 持久化提供商 -->
<property name="persistenceProvider" >
<ref bean="persistenceProvider" />
</property>
<!-- 特性提供商配置 -->
<property name="jpaVendorAdapter" >
<ref bean="jpaVendorAdapter" />
</property>
<!-- jpa 属性配置 -->
<property name="jpaProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.max_fetch_depth">3</prop>
<prop key="hibernate.hbm2ddl.auto">false</prop>
<prop key="hibernate.jdbc.fetch_size" >18</prop>
<prop key="hibernate.jdbc.batch_size" >10</prop>
<prop key="hibernate.format_sql" >true</prop>
</props>
</property>
</bean>
<context:component-scan base-package="com.own" />
<!-- 配置事物管理 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>