1. 在代码中使用 @Transactional
具体实现
applicationContext-dao.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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"
default-lazy-init="true">
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<!-- EntityManagerFactory -->
<bean id="entityManagerFactory1" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager" ref="persistenceUnitManager"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
</props>
</property>
</bean>
<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="persistenceXmlLocations">
<list>
<value>classpath:META-INF/persistence.xml</value>
</list>
</property>
<property name="defaultDataSource" ref="dataSource"/>
</bean>
<!-- Needed so the @PersistenceUnit annotation is recognized -->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<bean id="myTxManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory1" />
</bean>
<tx:annotation-driven transaction-manager="myTxManager" />
<!-- Activates scanning of @Repository -->
<context:component-scan base-package="com.pcjavanet.dao"/>
</beans>
applicationContext-resource.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:property-placeholder location="classpath:hibernate.properties,classpath:jdbc.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxActive" value="100"/>
<property name="maxWait" value="1000"/>
<property name="poolPreparedStatements" value="true"/>
<property name="defaultAutoCommit" value="true"/>
</bean>
</beans>
jdbc.properties
# If you want Maven to populate this file from its properties, uncomment the following section, remove the other
# sections and remove the <filters> element from pom.xml.
# -----------------------------------------
#jdbc.driverClassName=${jdbc.driverClassName}
#jdbc.url=${jdbc.url}
#jdbc.username=${jdbc.username}
#jdbc.password=${jdbc.password}
#hibernate.dialect=${hibernate.dialect}
# Needed by Hibernate3 Maven Plugin defined in pom.xml
#hibernate.connection.username=${jdbc.username}
#hibernate.connection.password=${jdbc.password}
#hibernate.connection.url=${jdbc.url}
#hibernate.connection.driver_class=${jdbc.driverClassName}
# MySQL
# -----------------------------------------
#jdbc.driverClassName=com.mysql.jdbc.Driver
#jdbc.url=jdbc:mysql://localhost/appfuse?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8
#jdbc.username=root
#jdbc.password=
#hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
# Needed by Hibernate3 Maven Plugin defined in pom.xml
#hibernate.connection.username=root
#hibernate.connection.password=
#hibernate.connection.url=jdbc:mysql://localhost/appfuse?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8
#hibernate.connection.driver_class=com.mysql.jdbc.Driver
# H2
# -----------------------------------------
#jdbc.driverClassName=org.h2.Driver
#jdbc.url=jdbc:h2:/tmp/appfuse_light
#jdbc.username=sa
#jdbc.password=
#hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://127.0.0.1:5432/jpa
jdbc.username=postgres
jdbc.password=dbms4Fna
# Needed by Hibernate3 Maven Plugin defined in pom.xml
hibernate.connection.username=postgres
hibernate.connection.password=postgres
hibernate.connection.url=jdbc:postgresql://127.0.0.1:5432/jpa
hibernate.connection.driver_class=org.postgresql.Driver
hibernate.properties
app.search.index.basedir=${search.index.basedir}
hibernate.search.default.directory_provider=filesystem
hibernate.search.default.locking_strategy=simple
hibernate.search.default.exclusive_index_use=true
hibernate.search.lucene_version=LUCENE_35
hibernate.search.analyzer=org.apache.lucene.analysis.en.EnglishAnalyzer
hibernate.search.worker.batch_size=100
UserDaoJpa.java
package com.pcjavanet.dao;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.pcjavanet.model.User;
@Repository("userDao")
//@Service("userDao")
public class UserDaoJpa extends GenericDaoJpa<User, Long> implements UserDao{
/* 还可以继续使用jdbcTemplate*/
@Autowired
private DataSource dataSource;
public void xxxx ( ) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
Table table = AnnotationUtils.findAnnotation(User.class, Table.class);
String sql ="xxxx";
jdbcTemplate.query(sql,
new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
}
},
new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
}
});
}
@Transactional
public User saveUser( User user ) {
User u = super.save(user);
System.out.println( u );
getEntityManager().flush();
return u;
}
}
UserDao.java
package com.pcjavanet.dao;
import com.pcjavanet.model.User;
public interface UserDao extends GenericDao<User, Long> {
User saveUser(User user);
}
GenericDao.java
package com.pcjavanet.dao;
import java.io.Serializable;
public interface GenericDao <T, PK extends Serializable> {
T save(T object);
}
GenericDaoJpa.java
package com.pcjavanet.dao;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class GenericDaoJpa<T, PK extends Serializable> implements GenericDao<T, PK> {
/**
* Log variable for all child classes. Uses LogFactory.getLog(getClass()) from Commons Logging
*/
protected final Log log = LogFactory.getLog(getClass());
public static final String PERSISTENCE_UNIT_NAME = "ApplicationEntityManager";
@PersistenceContext(unitName=PERSISTENCE_UNIT_NAME)
private EntityManager entityManager;
public T save(T object) {
return this.entityManager.merge(object);
}
public EntityManager getEntityManager() {
return this.entityManager;
}
}
测试代码
TestMain.java
package com.pcjavanet.execute;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.pcjavanet.dao.UserDao;
import com.pcjavanet.model.User;
public class TestMain {
public static void main(String[] args) {
String[] locations = {
"applicationContext-resource.xml", "applicationContext-dao.xml"};
org.springframework.context.support.ClassPathXmlApplicationContext ctx = (org.springframework.context.support.ClassPathXmlApplicationContext)new ClassPathXmlApplicationContext(locations);
User u = new User();
u.setUserName("Jack MO");
UserDao userDao = (UserDao) ctx.getBean("userDao");
userDao.saveUser( u );
}
}
User.java
package com.pcjavanet.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
@Entity
@Table(name = "app_user")
public class User {
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + "]";
}
private int userId ;
private String userName ;
private int age ;
private int sex ;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "profile_seq")
@SequenceGenerator(name = "profile_seq", sequenceName = "profile_seq",allocationSize=1 ) //产生Seq,设定步长
@DocumentId
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
@Column(nullable = false, length = 50)
@Field
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Column(nullable = false )
@Field
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
}
2. 在配置文件配置AOP
需要更改的代码有TestMain.java 和UserDaoJpa.java
另外需要新增service层
UserManagerImpl.java
package com.pcjavanet.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.pcjavanet.dao.UserDao;
import com.pcjavanet.model.User;
@Service("userManager")
public class UserManagerImpl /* extends GenericManagerImpl<User, Long> {
@Autowired
private UserDao userDao;
public User saveUser(User user) throws UserExistsException {
return userDao.saveUser(user);
}
}
UserManager.java
package com.pcjavanet.service;
import com.pcjavanet.model.User;
public interface UserManager {
User saveUser(User user) throws UserExistsException;
}
UserExistsException.java
package com.pcjavanet.service;
public class UserExistsException extends Exception {
private static final long serialVersionUID = 4050482305178810162L;
/**
* Constructor for UserExistsException.
*
* @param message exception message
*/
public UserExistsException(final String message) {
super(message);
}
}
新的 TestMain.java
package com.pcjavanet.execute;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.pcjavanet.model.User;
import com.pcjavanet.service.UserExistsException;
import com.pcjavanet.service.UserManager;
public class TestMain {
public static void main(String[] args) {
String[] locations = {
"applicationContext-service.xml",
"applicationContext-resource.xml", "applicationContext-dao.xml"};
org.springframework.context.support.ClassPathXmlApplicationContext ctx = (org.springframework.context.support.ClassPathXmlApplicationContext)new ClassPathXmlApplicationContext(locations);
User u = new User();
u.setUserName("Jack MO");
UserManager userM = (UserManager) ctx.getBean("userManager");
try {
userM.saveUser(u);
} catch (UserExistsException e) {
e.printStackTrace();
}
}
}
新 UserDaoJpa.java
package com.pcjavanet.dao;
import org.springframework.stereotype.Repository;
import com.pcjavanet.model.User;
@Repository("userDao")
//@Service("userDao")
public class UserDaoJpa extends GenericDaoJpa<User, Long>
//{
implements UserDao{
public User saveUser( User user ) {
User u = super.save(user);
System.out.println( u );
getEntityManager().flush();
return u;
}
}
Pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.pcjavanet</groupId>
<artifactId>jpsstudy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<defaultGoal>install</defaultGoal>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search</artifactId>
<version>${hibernate.search.version}</version>
<exclusions>
<exclusion>
<artifactId>hibernate-core</artifactId>
<groupId>org.hibernate</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-analyzers</artifactId>
<version>${hibernate.search.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.entitymanager.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.java-persistence</groupId>
<artifactId>jpa-api</artifactId>
<version>${jpa.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.security.version}</version>
<exclusions>
<exclusion>
<artifactId>spring-aop</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-expression</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
<exclusions>
<exclusion>
<artifactId>spring-aop</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
<exclusions>
<exclusion>
<artifactId>spring-expression</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-web</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>${commons.beanutils.version}</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>${commons.collections.version}</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${commons.dbcp.version}</version>
<exclusions>
<exclusion>
<artifactId>xercesImpl</artifactId>
<groupId>xerces</groupId>
</exclusion>
<exclusion>
<artifactId>commons-collections</artifactId>
<groupId>commons-collections</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons.lang.version}</version>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>8.3-603.jdbc4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<properties>
<aspectj.version>1.6.10</aspectj.version>
<commons.beanutils.version>1.8.3</commons.beanutils.version>
<commons.collections.version>3.2.1</commons.collections.version>
<commons.dbcp.version>1.3</commons.dbcp.version>
<commons.lang.version>2.6</commons.lang.version>
<jmock.version>2.5.1</jmock.version>
<junit.version>4.10</junit.version>
<jwebunit.version>2.5</jwebunit.version>
<spring.version>3.1.3.RELEASE</spring.version>
<spring.security.version>3.1.3.RELEASE</spring.security.version>
<!-- Application settings -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<copyright.year>2012</copyright.year>
<dao.framework>jpa</dao.framework>
<web.framework>struts</web.framework>
<amp.genericCore>true</amp.genericCore>
<amp.fullSource>false</amp.fullSource>
<db.name>jpa</db.name>
<ehcache.web.version>2.0.4</ehcache.web.version>
<hibernate.entitymanager.version>4.1.8.Final</hibernate.entitymanager.version>
<jpa.version>2.0-cr-1</jpa.version>
<hibernate.search.version>4.1.1.Final</hibernate.search.version>
<hibernate.version>4.1.8.Final</hibernate.version>
<cargo.version>1.2.4</cargo.version>
<jmock.version>2.5.1</jmock.version>
<jsp.version>2.1</jsp.version>
<junit.version>4.10</junit.version>
<servlet.version>2.5</servlet.version>
<wiser.version>1.2</wiser.version>
<hibernate.dialect>org.hibernate.dialect.PostgreSQLDialect</hibernate.dialect>
<jdbc.groupId>postgresql</jdbc.groupId>
<jdbc.artifactId>postgresql</jdbc.artifactId>
<jdbc.version>8.1-407.jdbc3</jdbc.version>
<jdbc.driverClassName>org.postgresql.Driver</jdbc.driverClassName>
<jdbc.url>jdbc:postgresql://localhost/${db.name}</jdbc.url>
<jdbc.username>postgres</jdbc.username>
<jdbc.password>dbms4Fna</jdbc.password>
<search.index.basedir>${project.build.testOutputDirectory}</search.index.basedir>
</properties>
</project>
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
version="1.0">
<persistence-unit name="ApplicationEntityManager"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.pcjavanet.model.User</class>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create" />
<!-- <property name="hibernate.hbm2ddl.auto" value="update" /> -->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.formate_sql" value="true" />
</properties>
</persistence-unit>
</persistence> /**
* {@inheritDoc}
*/
public String getUserPassword(Long userId) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
Table table = AnnotationUtils.findAnnotation(User.class, Table.class);
return jdbcTemplate.queryForObject(
"select password from " + table.name() + " where id=?", String.class, userId);
}