spring data jpa 的一些疑问

http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa/
《使用 Spring Data JPA 简化 JPA 开发》这篇文章相信大家一定拜读过
  但是这2天我在继续试用spring data jpa中遇到了不少挫折。
  首先遇到的是原文中写到“默认情况下,Spring Data JPA 实现的方法都是使用事务的。针对查询类型的方法,其等价于 @Transactional(readOnly=true);增删改类型的方法,等价于 @Transactional。可以看出,除了将查询的方法设为只读事务外,其他事务属性均采用默认值。”但是我配置了很长一段时间,发现dao这一层没用上@Transactional注解,而在service层用上@Transactional,JPA会发出SQL语句,但是不会存储到数据库,数据被回滚了。
  第二,原文中还提到“与继承 Repository 等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClass 和 idClass 属性。”两种等价的继承接口方式示例

[code="java"] public interface UserDao extends Repository { …… }
@RepositoryDefinition(domainClass = AccountInfo.class, idClass = Long.class)
public interface UserDao { …… } [/code]
我搞了半天就是报错
[code="java"]java.lang.ClassCastException: $Proxy23 cannot be cast to org.springframework.data.repository.Repository[/code]

网上查了很多资料,包括官方文档,都没提及这种错误的原因,我反复对照配置文件,实在找不出错误所在,不知谁能解答下疑惑。使用的是spring3.1.1,hibernate4,spring data jpa 1.03
  

xieyongwei
xieyongwei 对于问题一,再次摸索,发现基于接口继承的方式需要cglib做动态代理,似乎解释了出现事务问题的原因,但是目前网上找到的几乎所有示例,都未在Repository即Dao这一层申明事务。
7 年多之前 回复

2个回答

对于第一个问题:
这个注释@Transactional没有开启事务的功能,只是说明这个类包含了具有事务特性的元数据。。。开启事务是在配置中通过开启。。。。

第二个问题貌似是等价的,你用直接继承没问题的么?或者用注释的时候类型没对好。。。

xieyongwei
xieyongwei @RepositoryDefinition看来只是支持spring data,并没支持到spring data jpa 。
7 年多之前 回复
xieyongwei
xieyongwei 真是郁闷,是我自己搞晕了,数据被回滚的都是在基于SpringJUnit4ClassRunner的测试时发生,在自己的业务类中是没有问题的,因为在测试类中使用@Transactional 会在测试完成之后会回滚事务,spring为防止对数据库中的数据产生任何影响,居然忘记这个了,看来测试做的太少了! 不过还是要谢谢你的回答,对于第二个疑问,我再琢磨下看看。
7 年多之前 回复
aa1aa3
爱上一条鱼 哦,之前没看到。。。参考这个么 http://blog.springsource.org/2011/02/10/getting-started-with-spring-data-jpa/
7 年多之前 回复
xieyongwei
xieyongwei 这个我已经说明了 不过放错了位置 xieyongwei对于问题一,再次摸索,发现基于接口继承的方式需要cglib做动态代理,似乎解释了出现事务问题的原因,但是目前网上找到的几乎所有示例,都未在Repository即Dao这一层申明事务。 2012-06-22 10:21
7 年多之前 回复
aa1aa3
爱上一条鱼 据说,@Transactional设置后有两种代理模式 基于jdk或者基于cglib,不知道是不是这个问题 第二个问题不知道是不是这个原因,在<tx:annotation-driven>里加上proxy-target-class="true",不行的话就在dao里设置transaction也可以的么
7 年多之前 回复
xieyongwei
xieyongwei 就是说现在Dao接口这么写 @Transactional public interface UserDao extends Repository<User, Integer>{ public void save(User user); public User findById(int userId); } 而在test类或者业务层去掉@Transactional,数据才被存储。
7 年多之前 回复
xieyongwei
xieyongwei 你前面说的意思我理解 加入spring data jpa 之前,基于jpa原生的方式实现Dao接口,<tx:annotation-driven >开启事务,在test类或业务层中使用@Transactional,一切功能都是正常的;但是加入<jpa:repositories ...>使用spring data jpa,删除Dao接口实现类,才出现上述的问题。
7 年多之前 回复

这个注释@Transactional没有开启事务的功能说明这个类包含了具有事务特性的元数据 开启事务是在配置中通过开启
这个注释@Transactional没有开启事务的功能说明这个类包含了具有事务特性的元数据 开启事务是在配置中通过开启9.
孕妇不能吃哪些食物www.yunmama.org fujsd 医疗器械www.xyhbuy.com rfdse 天然水晶www.shuijing100.com dijfu 石家庄办网证www.shijiazhang288.com 内分泌失调怎么调理http://news.163.com/12/0418/11/7VCC1ER300014AEE.html 澳门赌 场www.duanguihai.com feitian

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问