spring 服务层中未关闭 Hibernate jpa 实体管理器
Hibernate jpa entity manager not being closed in spring service layer
我正在使用 Spring Boot 和 Hibernate JPA 开发 Web 服务应用程序。我有一个分层架构,它由请求控制器层、业务逻辑(服务)层和数据访问(存储库)层组成。域 model/entity 是:
@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;
}
如您所见,我有一个 User 实体,它与具有延迟加载策略的地址具有一对多的单向关系。在存储库层,我有一个简单的用户存储库,它扩展了 spring data JpaRepository.
public interface UserRepository extends JpaRepository<User, Long> {
}
在服务层,没有业务逻辑的简单用户拉取方法。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public User getUser(Long id) {
return this.userRepository.findOne(id);
}
}
在控制器简单用户资源控制器方法中。
@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);
}
}
我的问题是当我尝试从服务层获取用户时,我也会获取用户的地址,尽管它被声明为延迟初始化。我也没有启用交易。我没有在任何地方调用任何 getter 方法,除非在控制器中进行 JSON 序列化。 Hibernate JPA 实体管理器仍将在控制器层中打开。但我不知道怎么做。难道我不应该得到惰性初始化异常吗?
Spring Boot注册了一个OpenEntityManagerInViewInterceptor(检查class JpaBaseConfiguration),这确保实体管理器为完整的请求打开,这意味着,惰性收集可以在序列化时解决实体到 JSON.
如果您想禁用该行为,请将配置 spring.jpa.open-in-view=false
添加到您的 application.properties。
我正在使用 Spring Boot 和 Hibernate JPA 开发 Web 服务应用程序。我有一个分层架构,它由请求控制器层、业务逻辑(服务)层和数据访问(存储库)层组成。域 model/entity 是:
@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;
}
如您所见,我有一个 User 实体,它与具有延迟加载策略的地址具有一对多的单向关系。在存储库层,我有一个简单的用户存储库,它扩展了 spring data JpaRepository.
public interface UserRepository extends JpaRepository<User, Long> {
}
在服务层,没有业务逻辑的简单用户拉取方法。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public User getUser(Long id) {
return this.userRepository.findOne(id);
}
}
在控制器简单用户资源控制器方法中。
@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);
}
}
我的问题是当我尝试从服务层获取用户时,我也会获取用户的地址,尽管它被声明为延迟初始化。我也没有启用交易。我没有在任何地方调用任何 getter 方法,除非在控制器中进行 JSON 序列化。 Hibernate JPA 实体管理器仍将在控制器层中打开。但我不知道怎么做。难道我不应该得到惰性初始化异常吗?
Spring Boot注册了一个OpenEntityManagerInViewInterceptor(检查class JpaBaseConfiguration),这确保实体管理器为完整的请求打开,这意味着,惰性收集可以在序列化时解决实体到 JSON.
如果您想禁用该行为,请将配置 spring.jpa.open-in-view=false
添加到您的 application.properties。