Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当方法仅从数据库获取数据时,在服务中使用@Transactional。_Java_Spring Mvc_Spring Transactions - Fatal编程技术网

Java 当方法仅从数据库获取数据时,在服务中使用@Transactional。

Java 当方法仅从数据库获取数据时,在服务中使用@Transactional。,java,spring-mvc,spring-transactions,Java,Spring Mvc,Spring Transactions,我刚刚找到一段代码,如下所示: @Transactional public List<Foo> giveMeFooMatchingSomeConstraints(Long param1, String param2) { List<Bar> bars = barDao.findBars(param1, param2); List<Foo> foos = fooDao.findFoosByBarIds(barService.getIds(bars)); r

我刚刚找到一段代码,如下所示:

@Transactional
public List<Foo> giveMeFooMatchingSomeConstraints(Long param1, String param2) {
 List<Bar> bars = barDao.findBars(param1, param2);
 List<Foo> foos = fooDao.findFoosByBarIds(barService.getIds(bars));
 return foos; 
}
@Transactional
public List giveMeFoomMatchingSomeConstraints(长参数1,字符串参数2){
列表栏=barDao.findBars(param1,param2);
listfoos=fooDao.findFoosByBarIds(barService.getIds(bar));
返回foos;
}

我只是好奇,如果一个方法只获取数据而不修改数据,那么使用@Transactional的目的是什么。像上面这样的方法行吗

是的,当您不使用
Open*InView
并在方法中处理惰性关系时,它是有意义的

假设这些实体以一对多关系为边界:

@Entity(name = "user")
static class User extends AbstractPersistable<String> {
    private String username;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) //by default fetching is lazy
    @JoinColumn(name = "user_id", foreignKey = @ForeignKey(name = "fk_user_roles"))
    private Set<Role> roles = new HashSet<>();

    public Set<Role> getRoles() {
        return this.roles;
    }
}

@Entity(name = "role")
static class Role extends AbstractPersistable<String> {
    private String name;

    private Role() {
    }

    public Role(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}
所以读者会知道这个方法无意修改任何数据,但仍然需要事务(会话)


.

获取数据时可能会重复,无需使用Transactional进行注释,每当我们必须保留多个表时,时间只能使用Transactional。很好的解释,在这种情况下使用@Transactional的原因现在对我来说很清楚。我喜欢你提供的例子,谢谢!
interface UserDao extends JpaRepository<User, String> {}
@Service
static class UserService {
    private final UserDao userDao;

    UserService(UserDao userDao) {
        this.userDao = userDao;
    }

    @Transactional // <---
    public Set<String> findUserRoles() {
        final List<User> users = this.userDao.findAll();
        return users.stream()
                .flatMap(user -> user.roles.stream())
                .map(Role::getName)
                .collect(Collectors.toSet());
    }
}
@Transactional(readOnly = true)