从@Transactional方法(春季启动)返回对象时,为什么Hibernate不能完全解析我的对象?

时间:2019-12-05 13:53:37

标签: 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();
        return device;

    }

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

例如,在Device对象上有一个名为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属性,而是对象代理。

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

1 个答案:

答案 0 :(得分:2)

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

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