- 浏览: 21503973 次
- 性别:
博客专栏
-
跟我学spring3
浏览量:2418633
-
Spring杂谈
浏览量:3008767
-
跟开涛学SpringMVC...
浏览量:5639455
-
Servlet3.1规范翻...
浏览量:259916
-
springmvc杂谈
浏览量:1597309
-
hibernate杂谈
浏览量:250216
-
跟我学Shiro
浏览量:5858946
-
跟我学Nginx+Lua开...
浏览量:701998
-
亿级流量网站架构核心技术
浏览量:785219
文章分类
- 全部博客 (329)
- 跟我学Nginx+Lua开发 (13)
- 跟我学spring (54)
- 跟开涛学SpringMVC (34)
- spring4 (16)
- spring杂谈 (50)
- springmvc杂谈 (22)
- 跟我学Shiro (26)
- shiro杂谈 (3)
- hibernate杂谈 (10)
- java开发常见问题分析 (36)
- 加速Java应用开发 (5)
- Servlet 3.1规范[翻译] (21)
- servlet3.x (2)
- websocket协议[翻译] (14)
- websocket规范[翻译] (1)
- java web (6)
- db (1)
- js & jquery & bootstrap (4)
- 非技术 (4)
- reminder[转载] (23)
- 跟叶子学把妹 (8)
- nginx (2)
- 架构 (19)
- flume架构与源码分析 (4)
最新评论
-
xxx不是你可以惹得:
认真看错误代码,有时候重启电脑就行了 醉了 我把数据库配置写死 ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
holyselina 写道您前面说到能获取调用是的参数数组,我 ...
【第六章】 AOP 之 6.6 通知参数 ——跟我学spring3 -
xxx不是你可以惹得:
Access denied for user 'root'@' ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
只有@AspectJ支持命名切入点,而Schema风格不支持命 ...
【第六章】 AOP 之 6.5 AspectJ切入点语法详解 ——跟我学spring3 -
dagger9527:
支持虽然会迟到,但永远不会缺席!
【第四章】 资源 之 4.3 访问Resource ——跟我学spring3
JPA全称为Java持久性API(Java Persistence API),JPA是Java EE 5标准之一,是一个ORM规范,由厂商来实现该规范,目前有Hibernate、OpenJPA、TopLink、EclipseJPA等实现。 Spring目前提供集成Hibernate、OpenJPA、TopLink、EclipseJPA四个JPA标准实现。 Spring通过使用如下Bean进行集成JPA(EntityManagerFactory): persistenceUnitName:指定持久化单元的名称; 使用方式: 使用方式: 此处需要使用“jee”命名标签,且使用<jee:jndi-lookup>标签进行JNDI查找,“jndi-name”属性用于指定JNDI名字。 persistenceUnitManager:用于获取JPA持久化单元,默认实现DefaultPersistenceUnitManager用于解决多配置文件情况 dataSource:用于指定Spring定义的数据源; persistenceXmlLocation:用于指定JPA配置文件,对于对配置文件情况请选择设置persistenceUnitManager属性来解决; persistenceUnitName:用于指定持久化单元名字; persistenceProvider:用于指定持久化实现厂商类;如Hibernate为org.hibernate.ejb.HibernatePersistence类; jpaVendorAdapter:用于设置实现厂商JPA实现的特定属性,如设置Hibernate的是否自动生成DDL的属性generateDdl;这些属性是厂商特定的,因此最好在这里设置;目前Spring提供HibernateJpaVendorAdapter、OpenJpaVendorAdapter、EclipseLinkJpaVendorAdapter、TopLinkJpaVendorAdapter、OpenJpaVendorAdapter四个实现。其中最重要的属性是“database”,用来指定使用的数据库类型,从而能根据数据库类型来决定比如如何将数据库特定异常转换为Spring的一致性异常,目前支持如下数据库(DB2、DERBY、H2、HSQL、INFORMIX、MYSQL、ORACLE、POSTGRESQL、SQL_SERVER、SYBASE)。 jpaDialect:用于指定一些高级特性,如事务管理,获取具有事务功能的连接对象等,目前Spring提供HibernateJpaDialect、OpenJpaDialect 、EclipseLinkJpaDialect、TopLinkJpaDialect、和DefaultJpaDialect实现,注意DefaultJpaDialect不提供任何功能,因此在使用特定实现厂商JPA实现时需要指定JpaDialect实现,如使用Hibernate就使用HibernateJpaDialect。当指定jpaVendorAdapter属性时可以不指定jpaDialect,会自动设置相应的JpaDialect实现; jpaProperties和jpaPropertyMap:指定JPA属性;如Hibernate中指定是否显示SQL的“hibernate.show_sql”属性,对于jpaProperties设置的属性自动会放进jpaPropertyMap中; loadTimeWeaver:用于指定LoadTimeWeaver实现,从而允许JPA 加载时修改相应的类文件。具体使用得参考相应的JPA规范实现厂商文档,如Hibernate就不需要指定loadTimeWeaver。 接下来学习一下Spring如何集成JPA吧: 1、准备jar包,从下载的hibernate-distribution-3.6.0.Final包中获取如下Hibernate需要的jar包从而支持JPA: lib\jpa\hibernate-jpa-2.0-api-1.0.0.Final.jar //用于支持JPA 2、对象模型定义,此处使用UserModel2: 注意此处使用的所有注解都是位于javax.persistence包下,如使用@org.hibernate.annotations.Entity 而非@javax.persistence. Entity将导致JPA不能正常工作。 1、 JPA配置定义(chapter8/persistence.xml),定义对象和数据库之间的映射: 在JPA配置文件中,我们指定要持久化单元名字,和事务类型,其他都将在Spring中配置。 2、 数据源定义,此处使用第7章的配置文件,即“chapter7/applicationContext-resources.xml”文件。 3、 EntityManagerFactory配置定义(chapter8/applicationContext-jpa.xml): 4、 获取EntityManagerFactory: 此处我们使用了chapter7/applicationContext-resources.xml定义的“dataSource”数据源,通过ctx.getBean(EntityManagerFactory.class)获取EntityManagerFactory。 5、 通过EntityManagerFactory获取EntityManager进行创建和删除表: 使用EntityManagerFactory创建EntityManager,然后通过EntityManager对象的createNativeQuery创建本地SQL执行创建和删除表。 6、 使用EntityManagerFactory获取EntityManager对象进行持久化数据: 使用EntityManagerFactory获取EntityManager进行操作,看到这还能忍受冗长的代码和事务管理吗?Spring同样提供JpaTemplate模板类来简化这些操作。 大家有没有注意到此处的模型对象能自动映射到数据库,这是因为Hibernate JPA实现默认自动扫描类路径中的@Entity注解类及*.hbm.xml映射文件,可以通过更改Hibernate JPA属性“hibernate.ejb.resource_scanner”,并指定org.hibernate.ejb.packaging.Scanner接口实现来定制新的扫描策略。 JpaTemplate模板类用于简化事务管理及常见操作,类似于JdbcTemplate模板类,对于复杂操作通过提供JpaCallback回调接口来允许更复杂的操作。 接下来示例一下JpaTemplate的使用: 1、修改Spring配置文件(chapter8/applicationContext-jpa.xml),添加JPA事务管理器: 2、修改JPATest类,添加类变量ctx,用于后边使用其获取事务管理器使用: 3)JpaTemplate模板类使用: 此实例与Hibernate和Ibatis有所区别,通过JpaTemplate模板类进行如持久化等操作时必须有运行在事务环境中,否则可能抛出如下异常或警告: 以上异常和警告是没有事务造成的,也是最让人困惑的问题,需要大家注意。 类似于JdbcDaoSupport类,Spring对JPA也提供了JpaDaoSupport类来支持一致的数据库访问。JpaDaoSupport也是DaoSupport实现: 接下来示例一下Spring集成JPA的最佳实践: 1、 定义Dao接口,此处使用cn.javass.spring.chapter7.dao. IUserDao: 2、 定义Dao接口实现,此处是JPA实现: 此处注意首先JPA实现放在dao.jpa包里,其次实现类命名如UserJpaDaoImpl,即×××JpaDaoImpl,当然如果自己有更好的命名规范可以遵循自己的,此处只是提个建议。 另外在类上添加了@Transactional注解表示该类的所有方法将在调用时需要事务支持,propagation传播属性为Propagation.REQUIRED表示事务是必需的,如果执行该类的方法没有开启事务,将开启一个新的事务。 3、进行资源配置,使用resources/chapter7/applicationContext-resources.xml: 4、dao定义配置,在chapter8/applicationContext-jpa.xml中添加如下配置: 4.1、首先添加tx命名空间用于支持事务: 4.2、为@Transactional注解事务开启事务支持: 只为类添加@Transactional 注解是不能支持事务的,需要通过<tx:annotation-driven>标签来开启事务支持,其中txManager属性指定事务管理器。 4.3、配置DAO Bean: 首先定义抽象的abstractDao,其有一个entityManagerFactory属性,从而可以让继承的子类自动继承entityManagerFactory属性注入;然后定义userDao,且继承abstractDao,从而继承entityManagerFactory注入;我们在此给配置文件命名为applicationContext-jpa.xml表示JPA实现。 5、最后测试一下吧(cn.javass.spring.chapter8. JPATest): 和Spring JDBC框架的最佳实践完全一样,除了使用applicationContext-jpa.xml代替了applicationContext-jdbc.xml,其他完全一样。也就是说,DAO层的实现替换可以透明化。 还有与集成其他ORM框架不同的是JPA在进行持久化或更新数据库操作时需要事务支持。 Spring+JPA CRUD(增删改查)也相当简单,让我们直接看具体示例吧: Spring集成JPA进行增删改查也相当简单,但本文介绍的稍微复杂一点,因为牵扯到编程式事务,如果采用声明式事务将和集成Hibernate方式一样简洁。 原创内容,转载请注明出处【http://sishuok.com/forum/blogPost/list/0/2500.html】8.4 集成JPA
8.4.1 如何集成
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="persistenceUnit"/>
</bean>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
<jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/persistenceUnit"/>
</beans>
package cn.javass.spring.chapter8;
//省略import
@Entity
@Table(name = "test")
public class UserModel2 {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "name")
private String myName;
//省略getter和setter
}
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"/>
</persistence>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceXmlLocation" value="chapter8/persistence.xml"/>
<property name="persistenceUnitName" value="persistenceUnit"/>
<property name="persistenceProvider" ref="persistenceProvider"/>
<property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
<property name="jpaDialect" ref="jpaDialect"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="persistenceProvider" class="org.hibernate.ejb.HibernatePersistence"/>
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="false" />
<property name="database" value="HSQL"/>
</bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
package cn.javass.spring.chapter8;
//省略import
public class JPATest {
private static EntityManagerFactory entityManagerFactory;
@BeforeClass
public static void setUpClass() {
String[] configLocations = new String[] {
"classpath:chapter7/applicationContext-resources.xml",
"classpath:chapter8/applicationContext-jpa.xml"};
ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);
entityManagerFactory = ctx.getBean(EntityManagerFactory.class);
}
}
@Before
public void setUp() throws SQLException {
//id自增主键从0开始
String createTableSql = "create memory table test" + "(id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, " + "name varchar(100))";
executeSql(createTableSql);
}
@After
public void tearDown() throws SQLException {
String dropTableSql = "drop table test";
executeSql(dropTableSql);
}
private void executeSql(String sql) throws SQLException {
EntityManager em = entityManagerFactory.createEntityManager();
beginTransaction(em);
em.createNativeQuery(sql).executeUpdate();
commitTransaction(em);
closeEntityManager(em);
}
private void closeEntityManager(EntityManager em) {
em.close();
}
private void rollbackTransacrion(EntityManager em) throws SQLException {
if(em != null) {
em.getTransaction().rollback();
}
}
private void commitTransaction(EntityManager em) throws SQLException {
em.getTransaction().commit();
}
private void beginTransaction(EntityManager em) throws SQLException {
em.getTransaction().begin();
}
@Test
public void testFirst() throws SQLException {
UserModel2 model = new UserModel2();
model.setMyName("test");
EntityManager em = null;
try {
em = entityManagerFactory.createEntityManager();
beginTransaction(em);
em.persist(model);
commitTransaction(em);
} catch (SQLException e) {
rollbackTransacrion(em);
throw e;
} finally {
closeEntityManager(em);
}
}
8.4.2 使用JpaTemplate
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
package cn.javass.spring.chapter8;
public class JPATest {
private static EntityManagerFactory entityManagerFactory;
private static ApplicationContext ctx;
@BeforeClass
public static void beforeClass() {
String[] configLocations = new String[] {
"classpath:chapter7/applicationContext-resources.xml",
"classpath:chapter8/applicationContext-jpa.xml"};
ctx = new ClassPathXmlApplicationContext(configLocations);
entityManagerFactory = ctx.getBean(EntityManagerFactory.class);
}
}
@Test
public void testJpaTemplate() {
final JpaTemplate jpaTemplate = new JpaTemplate(entityManagerFactory);
final UserModel2 model = new UserModel2();
model.setMyName("test1");
PlatformTransactionManager txManager = ctx.getBean(PlatformTransactionManager.class);
new TransactionTemplate(txManager).execute(
new TransactionCallback<Void>() {
@Override
public Void doInTransaction(TransactionStatus status) {
jpaTemplate.persist(model);
return null;
}
});
String COUNT_ALL = "select count(*) from UserModel";
Number count = (Number) jpaTemplate.find(COUNT_ALL).get(0);
Assert.assertEquals(1, count.intValue());
}
8.4.3 集成JPA及最佳实践
package cn.javass.spring.chapter8.dao.jpa;
//省略import
@Transactional(propagation = Propagation.REQUIRED)
public class UserJpaDaoImpl extends JpaDaoSupport implements IUserDao {
private static final String COUNT_ALL_JPAQL = "select count(*) from UserModel";
@Override
public void save(UserModel model) {
getJpaTemplate().persist(model);
}
@Override
public int countAll() {
Number count =
(Number) getJpaTemplate().find(COUNT_ALL_JPAQL).get(0);
return count.intValue();
}
}
<?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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="abstractDao" abstract="true">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean id="userDao"
class="cn.javass.spring.chapter8.dao.jpa.UserJpaDaoImpl"
parent="abstractDao"/>
@Test
public void testBestPractice() {
String[] configLocations = new String[] {
"classpath:chapter7/applicationContext-resources.xml",
"classpath:chapter8/applicationContext-jpa.xml"};
ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);
IUserDao userDao = ctx.getBean(IUserDao.class);
UserModel model = new UserModel();
model.setMyName("test");
userDao.save(model);
Assert.assertEquals(1, userDao.countAll());
}
8.4.4 Spring+JPA的CRUD
@Test
public void testCRUD() {
PlatformTransactionManager txManager = ctx.getBean(PlatformTransactionManager.class);
final JpaTemplate jpaTemplate = new JpaTemplate(entityManagerFactory);
TransactionTemplate tansactionTemplate = new TransactionTemplate(txManager);
tansactionTemplate.execute(new TransactionCallback<Void>() {
@Override
public Void doInTransaction(TransactionStatus status) {
UserModel model = new UserModel();
model.setMyName("test");
//新增
jpaTemplate.persist(model);
//修改
model.setMyName("test2");
jpaTemplate.flush();//可选
//查询
String sql = "from UserModel where myName=?";
List result = jpaTemplate.find(sql, "test2");
Assert.assertEquals(1, result.size());
//删除
jpaTemplate.remove(model);
return null;
}
});
}
评论
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/jboss/logging/Logger
请问为什么必须要有jboss日志?
但是放到jetty时,增删改就报错了,是没有运行在事务环境中?
配置文件中加了<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
错误:
javax.persistence.TransactionRequiredException: Executing an update/delete query
发下详细的异常吧
但是放到jetty时,增删改就报错了,是没有运行在事务环境中?
配置文件中加了<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
错误:
javax.persistence.TransactionRequiredException: Executing an update/delete query
但是放到jetty时,增删改就报错了,是没有运行在事务环境中?
配置文件中加了<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
错误:
javax.persistence.TransactionRequiredException: Executing an update/delete query
不会出现您说的每个Dao一个EM,而是每个事务一个
是嗎,Spring只提供了JpaTemplate,怎麼用是開發人員的事,如果不瞭解JPA,很容易出現問題。等我寫個案例給你看看。
你可以看下源码 是这样的 而且JpaTemplate是在execute时 才决定创建/使用线程绑定的EM的
不会出现您说的每个Dao一个EM,而是每个事务一个
是嗎,Spring只提供了JpaTemplate,怎麼用是開發人員的事,如果不瞭解JPA,很容易出現問題。等我寫個案例給你看看。
public class ProductDaoImpl implements ProductDao { @PersistenceContext private EntityManager em; public Collection loadProductsByCategory(String category) { Query query = em.createQuery("from Product as p where p.category = :category"); query.setParameter("category", category); return query.getResultList(); } }
其他的刪掉或是一句話帶過就好。
这个倒是 spring3.1也推荐用这种原生的方式,
这个我在注解配置那章(第12章)写的。
但文章肯定要提供所有场景。
使用JpaTemplate 也是没有问题的,不会出现您说的每个Dao一个EM,而是每个事务一个
那看下spring 2.5.5中使用JpaTemplate的方式
第一種,使用JpaTemplate
<beans> <bean id="myProductDao" class="product.ProductDaoImpl"> <property name="entityManagerFactory" ref="myEmf"/> </bean> </beans>
public class JpaProductDao implements ProductDao { private JpaTemplate jpaTemplate; public void setEntityManagerFactory(EntityManagerFactory emf) { this.jpaTemplate = new JpaTemplate(emf); } public Collection loadProductsByCategory(final String category) throws DataAccessException { return (Collection) this.jpaTemplate.execute(new JpaCallback() { public Object doInJpa(EntityManager em) throws PersistenceException { Query query = em.createQuery("from Product as p where p.category = :category"); query.setParameter("category", category); List result = query.getResultList(); // do some further processing with the result list return result; } }); } }
第二種
繼承JpaDaoSupport
public class ProductDaoImpl extends JpaDaoSupport implements ProductDao { public Collection loadProductsByCategory(String category) throws DataAccessException { Map<String, String> params = new HashMap<String, String>(); params.put("category", category); return getJpaTemplate().findByNamedParams("from Product as p where p.category = :category", params); } }
JpaDaoSupport中需要注入EMF,而EM是內部創建的
protected EntityManager createEntityManager() throws IllegalStateException { EntityManagerFactory emf = getEntityManagerFactory(); Assert.state(emf != null, "No EntityManagerFactory specified"); Map<String, Object> properties = getJpaPropertyMap(); return (!CollectionUtils.isEmpty(properties) ? emf.createEntityManager(properties) : emf.createEntityManager()); }
這不是代碼問題是使用問題,每個DAO都有一個EM,EM中有一定的數據緩存,根據EM的實現,對數據庫中的新增數據會更新,對修改后的數據在查詢時不會更新。
例如一個DAO進行連表查詢,另一個DAO中進行子表的CRUD,修改的信息在查詢中不會更新的。
那看下spring 2.5.5中使用JpaTemplate的方式
第一種,使用JpaTemplate
<beans> <bean id="myProductDao" class="product.ProductDaoImpl"> <property name="entityManagerFactory" ref="myEmf"/> </bean> </beans>
public class JpaProductDao implements ProductDao { private JpaTemplate jpaTemplate; public void setEntityManagerFactory(EntityManagerFactory emf) { this.jpaTemplate = new JpaTemplate(emf); } public Collection loadProductsByCategory(final String category) throws DataAccessException { return (Collection) this.jpaTemplate.execute(new JpaCallback() { public Object doInJpa(EntityManager em) throws PersistenceException { Query query = em.createQuery("from Product as p where p.category = :category"); query.setParameter("category", category); List result = query.getResultList(); // do some further processing with the result list return result; } }); } }
那看下spring 2.5.5中使用JpaTemplate的方式
第一種,使用JpaTemplate
<beans> <bean id="myProductDao" class="product.ProductDaoImpl"> <property name="entityManagerFactory" ref="myEmf"/> </bean> </beans>
public class JpaProductDao implements ProductDao { private JpaTemplate jpaTemplate; public void setEntityManagerFactory(EntityManagerFactory emf) { this.jpaTemplate = new JpaTemplate(emf); } public Collection loadProductsByCategory(final String category) throws DataAccessException { return (Collection) this.jpaTemplate.execute(new JpaCallback() { public Object doInJpa(EntityManager em) throws PersistenceException { Query query = em.createQuery("from Product as p where p.category = :category"); query.setParameter("category", category); List result = query.getResultList(); // do some further processing with the result list return result; } }); } }
第二種
繼承JpaDaoSupport
public class ProductDaoImpl extends JpaDaoSupport implements ProductDao { public Collection loadProductsByCategory(String category) throws DataAccessException { Map<String, String> params = new HashMap<String, String>(); params.put("category", category); return getJpaTemplate().findByNamedParams("from Product as p where p.category = :category", params); } }
JpaDaoSupport中需要注入EMF,而EM是內部創建的
protected EntityManager createEntityManager() throws IllegalStateException { EntityManagerFactory emf = getEntityManagerFactory(); Assert.state(emf != null, "No EntityManagerFactory specified"); Map<String, Object> properties = getJpaPropertyMap(); return (!CollectionUtils.isEmpty(properties) ? emf.createEntityManager(properties) : emf.createEntityManager()); }
這不是代碼問題是使用問題,每個DAO都有一個EM,EM中有一定的數據緩存,根據EM的實現,對數據庫中的新增數據會更新,對修改后的數據在查詢時不會更新。
例如一個DAO進行連表查詢,另一個DAO中進行子表的CRUD,修改的信息在查詢中不會更新的。
第二種
繼承JpaDaoSupport
public class ProductDaoImpl extends JpaDaoSupport implements ProductDao { public Collection loadProductsByCategory(String category) throws DataAccessException { Map<String, String> params = new HashMap<String, String>(); params.put("category", category); return getJpaTemplate().findByNamedParams("from Product as p where p.category = :category", params); } }
JpaDaoSupport中需要注入EMF,而EM是內部創建的
protected EntityManager createEntityManager() throws IllegalStateException { EntityManagerFactory emf = getEntityManagerFactory(); Assert.state(emf != null, "No EntityManagerFactory specified"); Map<String, Object> properties = getJpaPropertyMap(); return (!CollectionUtils.isEmpty(properties) ? emf.createEntityManager(properties) : emf.createEntityManager()); }
這不是代碼問題是使用問題,每個DAO都有一個EM,EM中有一定的數據緩存,根據EM的實現,對數據庫中的新增數據會更新,對修改后的數據在查詢時不會更新。
例如一個DAO進行連表查詢,另一個DAO中進行子表的CRUD,修改的信息在查詢中不會更新的。
這不是代碼問題是使用問題,每個DAO都有一個EM(这个如果是spring管理事务的,不是每个DAO一个,而是一个事务一个),EM中有一定的數據緩存(一级缓存),根據EM的實現,對數據庫中的新增數據會更新,對修改后的數據在查詢時不會更新(你这个查询是 修改之前?还是修改之后?(修改会自动清除二级缓存的,再次查询返回最新的数据))。
能否把您的用例发过来研究下 什么问题 admin@sishuok.com
public class ProductDaoImpl implements ProductDao { @PersistenceContext private EntityManager em; public Collection loadProductsByCategory(String category) { Query query = em.createQuery("from Product as p where p.category = :category"); query.setParameter("category", category); return query.getResultList(); } }
其他的刪掉或是一句話帶過就好。
发表评论
-
第十九章 动态URL权限控制——《跟我学Shiro》
2014-03-28 22:51 0用过Spring Security的朋友应该比较熟悉对URL ... -
第十九章 动态URL权限控制——《跟我学Shiro》
2014-03-28 22:51 0用过Spring Security的朋友应该比较熟悉对URL ... -
在应用层通过spring解决数据库读写分离
2012-11-09 07:28 3如何配置mysql数据库的主从? 单机配置mys ... -
跟我学spring3系列 word原版 下载
2012-11-03 20:39 122189《跟我学spring3系列》自发布以来得到大家的认可,非 ... -
跟我学spring3 电子书下载(完)
2012-05-03 14:23 52715感谢iteye各位网友对我的支持,在此谢过了! ... -
跟我学spring3 目录贴及电子书下载
2012-04-10 19:00 390480扫一扫,关注我的公众号 购买地址 ... -
【第十三章】 测试 之 13.3 集成测试 ——跟我学spring3
2012-03-30 07:11 2750013.3 集成测试 13.3.1 ... -
【第十三章】 测试 之 13.1 概述 13.2 单元测试 ——跟我学spring3
2012-03-28 07:46 2361313.1 概述 13.1.1 测 ... -
【第十二章】零配置 之 12.5 综合示例-积分商城 ——跟我学spring3
2012-03-27 15:13 2079912.5 综合示例 12.5.1 概述 在第十一 ... -
【第十二章】零配置 之 12.4 基于Java类定义Bean配置元数据 ——跟我学spring3
2012-03-26 08:26 2990412.4 基于Java类定义Bean配置元数据 12 ... -
【第十二章】零配置 之 12.4 基于Java类定义Bean配置元数据 ——跟我学spring3
2012-03-26 08:00 56712.4 基于Java类定义Bean配置元数据 12 ... -
spring培训PPT(欢迎下载)
2012-03-24 21:55 45java私塾的 spring培训的PPT 欢迎大家下载。 包括 ... -
java私塾的spring培训PPT(欢迎下载)
2012-03-22 12:41 2973java私塾的 spring培训的PPT 欢迎大家下载。 ... -
【第十二章】零配置 之 12.3 注解实现Bean定义 ——跟我学spring3
2012-03-22 08:00 2665312.3 注解实现Bean定 ... -
【第十二章】零配置 之 12.2 注解实现Bean依赖注入 ——跟我学spring3
2012-03-19 08:00 3314912.2 注解实现Bean依赖注入 12.2.1 ... -
【第十二章】零配置 之 12.1 概述 ——跟我学spring3
2012-03-19 07:59 2028912.1 概述 12.1.1 什 ... -
【第十一章】 SSH集成开发积分商城 之 11.3 实现积分商城层 ——跟我学spring3
2012-03-16 08:09 1805711.3 实现积分商城层 11.3.1 概述 ... -
【第十一章】 SSH集成开发积分商城 之 11.2 实现通用层 ——跟我学spring3
2012-03-14 08:08 1911611.2 实现通用层 11.2 ... -
【第十一章】 SSH集成开发积分商城 之 11.1 概述 ——跟我学spring3
2012-03-13 16:37 1941611.1 概述 11.1.1 功能概述 ... -
【第十章】集成其它Web框架 之 10.4 集成JSF ——跟我学spring3
2012-03-13 08:46 12592先进行通用配置, 【第十章】集成其它Web框架 之 1 ...
相关推荐
1. spring 1.1 【第二章】 IoC 之 2.3 IoC的配置使用——跟我学Spring3 . . ....1.36 【第八章】 对ORM的支持 之 8.2 集成Hibernate3 ——跟我学spring3 . . . . . . . . . . . . . . . . . . .352
在本节中,我们将深入探讨Spring 3如何支持ORM(对象关系映射)技术,特别是其与Hibernate 3的集成。ORM技术允许开发者将数据库操作抽象化,使得Java对象可以直接与数据库中的记录进行交互,从而减少对SQL的直接依赖...
通过阅读《跟我学Spring3(8.1)对ORM的支持之概述Java开发Java经验技巧共3页.pdf》这本书或文档,你可以深入学习Spring如何无缝地集成ORM框架,提升你的Java开发技能。但请注意,压缩包内的"赚钱项目"文件可能与此...
本示例“spring boot整合JPA——demo”将演示如何在Spring Boot项目中配置和使用JPA。 首先,我们需要理解Spring Boot与JPA的关系。Spring Boot是基于Spring框架的快速开发工具,它通过自动化配置减少了常规设置...
压缩包中的"gen-wo-xue-spring.pdf"可能是教程的概述或部分章节,"跟我学spring3(1-7).pdf"和"跟我学spring3(8-13).pdf"分为了两部分,覆盖了从基础到进阶的内容。"跟我学spring3-源码.rar"包含了示例代码,方便读者...
8.1节概述对ORM的支持,8.2节介绍如何集成Hibernate3,8.3节介绍如何集成iBATIS,8.4节介绍如何集成JPA(Java Persistence API)。 【第九章】Spring的事务管理。事务是数据库管理系统执行过程中的一个逻辑单位,由...
《跟我学Spring3》这本书详细介绍了Spring框架在多个方面的应用,包括ORM支持、事务管理和Web框架集成等。以下是对这些章节内容的详细说明: 【第八章】 对ORM的支持: 1. **8.1 概述**:ORM(Object-Relational ...
《跟我学Spring3》是一本深入浅出的Spring框架学习指南,...通过阅读这两部分PDF(跟我学spring3(8-13).pdf和跟我学spring3(1-7).pdf),你将能够逐步构建起对Spring框架的全面认识,从而在Java开发领域更上一层楼。
《跟我学Spring3》这本书详细介绍了Spring框架与各种ORM(对象关系映射)框架的集成,以及Spring的事务管理和Web框架集成。以下是其中关键知识点的深入解析: **8. ORM支持** 1. **8.1 概述**:ORM允许开发者以面向...
Spring 是一个强大的轻量级应用框架,而 OpenJPA 是一个开源的 Java Persistence API (JPA) 实现,它允许开发者将对象关系映射(ORM)功能无缝集成到应用程序中。在本文中,我们将深入探讨如何将 Spring 框架与 Open...
Spring4是Spring框架的一个版本,它增强了性能,提供了对Java 8的全面支持,并且改进了对WebSocket的支持。Spring4简化了依赖注入,强化了AOP(面向切面编程)功能,同时提供了更强大的数据访问和Web服务支持。 **2...
在第二部分(8-13章)中,开涛将深入讲解Spring的高级特性,如数据访问集成(包括JDBC、ORM框架如Hibernate和MyBatis)、Web层支持(如MVC框架)、以及Spring与其它技术的整合,如Spring Security用于权限控制和...
《跟我学Spring3》是一本深入浅出介绍Spring框架的电子书,分为两部分,分别是“跟我学Spring3(8-13).pdf”和“跟我学Spring3(1-7).pdf”,全面覆盖了Spring框架的核心概念和技术。Spring作为Java开发中的主流框架,...
### Spring MVC 集成JPA:从理论到实践 #### 一、Spring与JPA简介 Spring框架作为Java开发领域的重要组成部分,以其强大的依赖注入(DI)和面向切面编程(AOP)功能,为Java应用提供了灵活的模块化支持。而Java...
Java Web高级编程是一门涵盖多种技术的课程,这些技术包括WebSockets、Spring Framework、JPA(Java Persistence API)以及Hibernate和Spring Security。下面将详细介绍这些知识点。 WebSockets是一种网络通信技术...
**Spring 2.5 集成 JPA 知识点详解** 在Java开发中,Spring框架因其强大的功能和灵活性而被广泛使用。Spring 2.5版本是Spring框架的一个重要里程碑,它引入了许多新特性,包括对Java Persistence API (JPA) 的全面...
Spring集成JPA(Java Persistence API)是将Spring框架与ORM(Object-Relational Mapping)解决方案之一的Hibernate结合使用的常见实践。这个例子展示了如何在Spring应用中配置和使用JPA,以便利用Hibernate作为JPA...
根据给定文件的信息,我们可以提炼出一系列关于Spring框架的关键知识点,特别是围绕ORM的支持、事务管理、集成其他Web框架以及零配置等内容。以下是对这些知识点的详细解析: ### 一、Spring框架简介 #### 1.1 ORM...
JPA适用于那些对ORM有较高需求的场景,而MyBatis在需要编写复杂SQL或对性能要求较高的地方更有优势。在实际项目中,可以根据业务需求和性能评估,灵活选择或结合使用这两种技术。 总结来说,Spring集成JPA和MyBatis...