Java Spring@Transactional持久化方法不工作

Java Spring@Transactional持久化方法不工作,java,spring,Java,Spring,我有一个SpringMVC示例应用程序,它使用UserDaoImpl类将用户类型对象保存到数据库中。下面是UserDaoImpl代码 public class UserDaoImpl implements UserDao<User> { private EntityManagerFactory emf; @PersistenceContext private EntityManager em; @Transactional public void saveUser(User u

我有一个SpringMVC示例应用程序,它使用UserDaoImpl类将用户类型对象保存到数据库中。下面是UserDaoImpl代码

public class UserDaoImpl implements UserDao<User> {

private EntityManagerFactory emf;

@PersistenceContext
private EntityManager em;

@Transactional
public void saveUser(User user){
    em.persist(user);
}
当我从UserDaoImpl类中删除“implements UserDao”部分时,用户将按预期持久化到数据库

我还尝试了没有用户参数的UserDao接口(即非泛型版本)。仍然出现上述错误

这可能是一个很容易回答的问题,但我花了几个小时才找到解决办法


我做错了什么???

您没有提供问题代码(或完整堆栈跟踪),但问题是:

当您将一个类注释为@Transactional,并且Spring为您创建了一个实例时,您得到的不是该类,而是实现该类接口的Java动态代理

因此,您无法将该对象强制转换为原始类型(不再是该类型!),而必须使用其接口

如果没有要实现的接口,它将为您提供类的CGLib代理,它基本上只是类的运行时修改版本,因此可分配给类本身

搜索要注入或强制转换的位置,键入UserDaoImpl,并改为更改对UserDao的引用,它将正常工作

我已经了解到CGLib代理和动态Java代理之间的性能差异非常小,因此您还可以将以下内容添加到spring配置中,以强制它使用CGLib代理而不是Java动态代理:

<aop:config proxy-target-class="true">



也为我工作。这一点是
proxy target class=“true”
,感谢接受答案的所有者。但随后将需要cglib依赖项。

是的。成功了。谢谢你的回复,查尔斯。添加当然没有必要,问题是我使用了ClassPathXmlApplicationContext的getBean方法,并试图将其转换为UserDaoImpl类,而不是UserDao接口类型,再次感谢。@Charles回答得很好,但我想补充一点,无论如何,
@Transactional
不应该在dao级别设置(它属于服务级别),除了
@Transactional(必需)之外
@Sean我总是根据需要为我的DAO添加注释,以便它们在还不存在事务的情况下创建自己的事务。这允许在应用程序的多个级别上重复使用DAO,这在某些情况下可能很有用。如果需要新的DAO,这将是一个错误,但我认为使用
@Transactional
(默认为REQUIRED)、REQUIRED或SUPPORTS。@Charles我在某种程度上同意。它不是干净的,但它是一条生命线,可以帮助您避免糟糕的编码:-)
java.lang.ClassCastException: $Proxy71 cannot be cast to org.samith.UserDaoImpl
<aop:config proxy-target-class="true">
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>