gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:24:11 25 4
gpt4 key购买 nike

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

@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);
}
}

在 Controller 中简单的用户资源 Controller 方法。

@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);
}
}

我的问题是,当我尝试从服务层获取用户时,我也会获取用户的地址,尽管它被声明为延迟初始化。我也没有启用交易。除了 Controller 中的 JSON 序列化之外,我没有在任何地方调用任何 getter 方法。 Hibernate JPA 实体管理器仍将在 Controller 层打开。但我不知道怎么办。我不是应该得到延迟初始化异常吗?

最佳答案

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

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

关于Hibernate jpa 实体管理器未在 Spring 服务层中关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33058605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com