【问题标题】:Hibernate jpa entity manager not being closed in spring service layerHibernate jpa 实体管理器未在 Spring 服务层中关闭
【发布时间】:2016-01-08 14:28:13
【问题描述】:

我正在使用 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;
}

如您所见,我有一个 User 实体,它与带有延迟加载策略的地址具有一对多的单向关系。在存储库层,我有一个简单的用户存储库,它扩展了 spring 数据 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);
    }
}

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

【问题讨论】:

  • 你真的在字段上有映射注释而不是getter吗?据我所知,如果字段访问是属性(getter),Hibernate 允许您在不获取对象的情况下获取惰性关联的 ID。详情请查看this
  • 我确实有 getter 和 setter。我删除它只是为了显示实体之间的关系并保持帖子简短。谢谢
  • 你在getter而不是字段的Address类中也有@Id注释吗?因为这可以解释你看到的行为
  • 我在 getter 的 Address 类中没有 @Id 注释。但我立即设置并检查,仍然是同样的问题。谢谢
  • 引擎盖下可能有一些我不完全理解的魔法。我将尝试研究它在内部是如何工作的,如果我弄明白了,我会把它作为答案发布。现在请记住,获取惰性关联的 ID 并不一定会在某些条件下触发该关联的获取。

标签: hibernate jpa spring-boot spring-transactions lazy-initialization


【解决方案1】:

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

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

【讨论】:

  • 完全有效...感谢 dunni 和 bohuslav 的帮助...我一直认为官方文档是完美的参考资料,但无法在实践中应用这些学科。谢谢兄弟
猜你喜欢
  • 1970-01-01
  • 2014-09-06
  • 2019-01-03
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 2012-09-03
  • 2016-03-24
  • 2013-10-13
相关资源
最近更新 更多