Java 为什么';从@Transactional方法(Spring boot)返回对象时,Hibernate是否完全解析对象?

Java 为什么';从@Transactional方法(Spring boot)返回对象时,Hibernate是否完全解析对象?,java,spring,hibernate,spring-boot,spring-transactions,Java,Spring,Hibernate,Spring Boot,Spring Transactions,我的serviceImpl.java类中有一个包含这一行的方法: Device-Device=getDevice(nbr) 在同一类中,有一种方法: @Transactional(transactionManager = JpaConfigCbOrg.TX_MGR) private Device getDevice(Long nbr) { Device device = deviceRepository.findById(nbr).get();

我的serviceImpl.java类中有一个包含这一行的方法:

Device-Device=getDevice(nbr)

在同一类中,有一种方法:

 @Transactional(transactionManager = JpaConfigCbOrg.TX_MGR)
    private Device getDevice(Long nbr)
    {

        Device device = deviceRepository.findById(nbr).get();
        return device;

    }

当我从getDevice方法中获取设备时,设备对象尚未完全解析,但其字段仍然具有对象代理,即使我已使用@Transactional注释了getDevice方法

例如,设备对象上有一个名为DeviceModel的属性,其声明如下:

 @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "model_nbr", referencedColumnName = "model_nbr"),
            @JoinColumn(name = "dev_type", referencedColumnName = "dev_type")
    })
    private DeviceModel          model;
但是当我从这个@Transactional方法返回设备对象后,我看不到实际的DeviceModel属性,而是一个对象代理


为什么会这样?关于hibernate和使我相信此方法应该返回完整对象的事务,我缺少什么

第1期:
@Transactional
对私有方法没有任何影响,除非您使用基于aop的代理。get操作也不需要事务属性,因为您不控制提交或刷新

问题2:
声明为懒惰的对象将具有代理,直到您调用懒惰对象上的问候者。尝试
device.getModel()
并检查对象

您已将
模型设置为延迟加载。然而,您并没有调用任何getter或其他任何东西来实际加载它。这是否是以事务方式加载的,与此无关。可能很多。甚至没有给出对事务的完全理解,Hibernate的复杂程度可能与此相同。但至少这个问题只是Hibernate,正如Karthik指出的那样,事务注释没有被处理,也不需要(
DevicePository
将启动自己的事务)。这个私有方法很好。