Hibernate jpa实体管理器未在spring服务层关闭

Man*_*Rai 3 hibernate jpa spring-transactions lazy-initialization spring-boot

我正在使用Spring Boot和Hibernate JPA开发Web服务应用程序.我有一个分层架构,包括请求控制器层,业务逻辑(服务)层和数据访问(存储库)层.域模型/实体是:

@Entity
public class User {

    @Id
    @GeneratedValue
    private Long id;
    @OneToMany
    @JoinColumn(name = "userId")
    private List<Address> addresses;
}

@Entity
public class Address {

    @Id
    @GeneratedValue
    private Long id;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我有一个User实体,它具有一对多的单向关系,并且具有延迟加载策略的地址.在存储库层中,我有一个简单的用户存储库,它扩展了Spring数据JpaRepository.

public interface UserRepository extends JpaRepository<User, Long> {
}
Run Code Online (Sandbox Code Playgroud)

在服务层,简单的用户提取方法没有业务逻辑.

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public User getUser(Long id) {
        return this.userRepository.findOne(id);
    }
}
Run Code Online (Sandbox Code Playgroud)

在控制器简单的用户资源控制器方法

@RestController
@RequestMapping(value = "/api/v1/users")
public class UserResource {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/{userId}", method = RequestMethod.GET)
    public User getUser(@PathVariable Long userId) {
        return this.userService.getUser(userId);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是当我尝试从服务层获取用户时,我也会获得用户的地址,尽管它是为延迟初始化而声明的.我也没有启用交易.我没有在任何地方调用任何getter方法,除非在控制器中进行JSON序列化.Hibernate JPA实体管理器仍将在控制器层中打开.但我无法想象如何.是不是我应该得到延迟初始化异常?

dun*_*nni 6

Spring Boot注册了一个OpenEntityManagerInViewInterceptor(检查类JpaBaseConfiguration),它确保实体管理器对完整请求是开放的,这意味着,在将实体序列化为JSON时可以解析延迟集合.

如果要禁用该行为,请将配置添加spring.jpa.open-in-view=false到application.properties.