通过用户名删除Spring Boot

16 浏览
0 Comments

通过用户名删除Spring Boot

在我的Spring MVC web应用程序中,当尝试调用"persist"方法将实体模型保存到数据库时,出现了这个错误。在互联网上找不到任何与此特定错误相关的帖子或页面。似乎EntityManagerFactory bean有问题,但是我对Spring编程还很陌生,所以对我来说,一切都初始化得很好,符合网络上的各种教程文章。

dispatcher-servlet.xml



    
     
     
     
    
     
     
     
        
        
        
        
    
 
    
    
    
        
            
            
            
        
    
    
        
            3
            50
            10
        
    

    
    
    

    
             
    
    
    
        /WEB-INF/jsp/
    
    
        .jsp
    

    
    

RegisterController.java

@Controller
public class RegisterController {
    @PersistenceContext
    EntityManager entityManager;
    @Autowired
    PasswordValidator passwordValidator;
    @InitBinder
    private void initBinder(WebDataBinder binder) {
        binder.setValidator(passwordValidator);
    }
    @RequestMapping(value = "/addUser", method = RequestMethod.GET)
    public String register(Person person) {
        return "register";
    }
    @RequestMapping(value = "/addUser", method = RequestMethod.POST)
    public String register(@ModelAttribute("person") @Valid @Validated Person person, BindingResult result) {
        if(result.hasErrors()) {
            return "register";
        } else {
            entityManager.persist(person);
            return "index";
        }
    }

0
0 Comments

这个问题的出现的原因是AspectJ没有正确处理Service实例化,导致代理只是简单地调用底层方法而没有执行正常的Spring魔法。解决方法是在Service类上添加(proxyMode = ScopedProxyMode.INTERFACES)注解。这个注解的作用是将代理模式设置为接口模式,可以解决这个问题。该注解对所有的持久化方法都起作用。希望这篇文章对那些在加载来自jar的服务时遇到相同问题的人有帮助。

(proxyMode = ScopedProxyMode.INTERFACES)
public class CoreServiceImpl implements CoreService {
    protected EntityManager entityManager;
    public final <T extends AbstractEntity> int deleteAll(Class<T> clazz) {
        CriteriaDelete<T> criteriaDelete = entityManager.getCriteriaBuilder().createCriteriaDelete(clazz);
        criteriaDelete.from(clazz);
        return entityManager.createQuery(criteriaDelete).executeUpdate();
    }
}

将(proxyMode = ScopedProxyMode.INTERFACES)注解添加到实现接口的DAO类中非常重要。我花了一整天的时间来解决这个问题,你的解决方法是唯一有效的。非常感谢!一个注解让我节省了大约3天的时间。我刚刚体验到了edenema的真正力量。Дякс。

0
0 Comments

在使用Spring Data Repository中的deleteBy自定义方法时,我遇到了这个异常。这个操作是在一个JUnit测试类中尝试的。

在JUnit类级别使用注解时,不会出现异常。

我当时遇到了同样的情况,我没有在测试类上注解,而是在服务方法上注解,这样即使不是测试也会起作用。

在类级别使用可能会掩盖可能在服务中操作不同事务的测试问题。

我在与数据库实际交互的repository方法上使用了,并且它正常工作。

当尝试使用'deleteBy'时,我遇到了这个问题。我将方法改为'delete'并将整个对象作为参数传递。

在遵循Chad Derby的教程时,我遇到了这个问题。他教授说默认情况下JPA在服务级别上有,所以我们不需要在这里添加。但是在删除时,我们实际上需要使用entityManager.remove(object)。

0
0 Comments

问题出现的原因是方法缺少了@Transactional注解。根据Spring的文档,@Transactional注解的默认的type属性是PersistenceContextType.TRANSACTION,这意味着方法需要处于一个事务中才能正常工作。如果一个没有@Transactional注解的方法调用了同一个类文件中有@Transactional注解的方法,也会出现这个错误。

解决方法是为方法添加@Transactional注解。可以在方法上添加注解,也可以在Service类上添加注解。需要注意的是@Transactional注解只能用于公共方法。

为什么需要添加@Transactional注解呢?如果你只是读取数据而不做任何更改,那么可以不添加注解。但是如果你进行了数据更改的操作,就需要确保你调用的查询/处理方法是唯一更改数据的操作,以保持数据库的ACID特性。

还需要注意的是,@Transactional注解只对公共方法起作用。如果出现注解方法不起作用的情况,可以尝试为调用方法也添加@Transactional注解,或者在不同的类中调用方法。

需要注意的是,@Transactional注解需要使用javax.transaction.Transactional注解,而不是Spring的注解。如果需要以编程方式进行事务管理,可以使用TransactionTemplate

总结起来,解决问题的方法就是为方法添加@Transactional注解,并确保调用的方法也添加了该注解。

0