当我在一个方法中有多个操作时,saveUser方法不会保存用户对象名称更改。如果我在saveUser服务方法之上使用@Transactional(传播=传播。REQUIRED),它可以正常工作。当另一个类创建一个新的User对象并设置其所有值并调用createUser方法时,它可以正常工作。为什么我需要@Transactional用于saveUser方法?在什么情况下我需要包含@Transactional?我使用的是Spring Data和JPA(Hibernate impl)。有什么想法吗?
JPA实体:
@Entity
public class User{
@Id
@GeneratedValue
private Long id;
@Column
private String name;
//getters/setters..etc
}
Spring服务:
@Service
public class UserServiceImpl{
@Autowired
UserRepository userRepository;
public void saveUser(Long id){
User user = userRepository.findById(id);
user.setName("newname");
userRepository.save(user);
}
public void createUser(User user){
userRepository.save(user);
}
}
Spring Data JPA/Hibernate Impl存储库:
public interface UserRepository extends JpaRepository<User, Long> {
}
如果更新数据库状态(插入/更新/删除),则需要事务,否则最终会出现这种行为。
即使在方法中执行只读操作,也应该使用事务性(readOnly=true)注释它们,以便Spring可以优化事务性资源。
默认情况下,JpaRepository中的方法是事务性的(只读以便检索)。
现在在您的saveUser()
方法中,您需要@Transactional
,因为您正在通过id
检索User
并更新它,然后再次持久化到数据库。基本上,@Transactional(只读=true)
在Spring Data JPA中使用其他@Transactional
时使用。
User user = userRepository.findById(id);
如果找不到任何用户,则向用户返回null。设置名称(“新名称”) 将给出NullPointerException。
问题内容: 我在Service类中看到了一种被标记为的方法,但是它也在同一类中调用了其他未标为的方法。 这是否意味着对单独方法的调用导致应用程序打开与DB的单独连接或暂停父事务等? 不带任何注释的方法的默认行为是什么,而另一个带有注释的方法调用该方法的默认行为是什么? 问题答案: 当你调用没有事务块之内的方法时,父事务将继续使用新方法。它将使用与父方法(with )相同的连接,以及在调用的方法中导
问题内容: 我想使用Spring Security保护我的服务层。如文档中所述,我需要使用a 来检查是否允许方法调用。 要确定是否允许给定用户调用服务方法,对我来说影响对调用的方法的必需角色(使用)是不够的,因为这也取决于传递给方法的参数。如文档中所建议,我可以编写一个自定义并通过安全对象访问参数(在这种情况下)。 但是,我的授权逻辑在所有方法中都不同。例如,多个方法之间的参数可能不同,并且授权逻
要决定是否允许为给定用户调用服务方法,对被调用的方法影响所需的角色(使用)对我来说是不够的,因为它还取决于传递给方法的参数。正如文档中所建议的,我可以编写一个自定义的并通过安全对象访问参数(在本例中是)。 但是,我的授权逻辑在不同的方法中是不同的。例如,多个方法之间的参数可能不同,授权逻辑也会不同。 我看到两个选择: 我可以在中使用条件逻辑来确定调用的方法和要使用的授权逻辑,但这似乎是一个丑陋的解
我想在调用非公共方法(bar)后执行一些特定操作。此方法在另一个方法(foo)中调用。请注意,“bar”和“foo”都是在第三方jar文件中定义的。 我试图在面向方面的编程中使用Spring使用注释来做到这一点。然而,我不能这样做。 在调用jar文件中的特定函数之后,有人能告诉我如何做特定的事情(调用特定函数)吗?
我正在使用带有webflux的spring boot 2.4.2连接到postgres数据库。我在使用事务性代码时观察到了一个我不理解的行为。 为了展示这种行为,我创建了一个示例应用程序,试图将行添加到两个表中;表“a”和表“b”。对表“a”的插入预计将失败,并出现重复密钥冲突。考虑到使用了事务性,我希望不会向表“b”中添加任何行。 然而,根据我用哪个方法注释事务,我会得到不同的结果。 如果我对c