java - 当从 @Transactional 方法(Spring boot)返回对象时,为什么 Hibernate 没有完全解析我的对象?

标签 java spring hibernate spring-boot spring-transactions

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

设备 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 方法返回 Device 对象后查看它时,我没有看到实际的 DeviceModel 属性,而是一个对象代理。

为什么会发生这种情况?我对 hibernate 和事务缺少什么让我相信这个方法应该返回完整的对象?

最佳答案

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

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

关于java - 当从 @Transactional 方法(Spring boot)返回对象时,为什么 Hibernate 没有完全解析我的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59196707/

相关文章:

java - 为什么会发生此 ArrayIndexOutOfBounds 异常?

java - JButton 打印多次而不是一次。为什么?

java - MS SQL 多线程死锁

java - 类似于 Dynatrace 的工具

java - Arrays.copyOf 在使类不可变方面扮演什么角色?

java - Android 解析 JSON 数组

spring - 如何将 CodePro Analytix 与 Spring MVC 项目一起使用来生成 jUnit?

java - @Inject 和 @Autowired 是否应该显式声明?

java - Spring 错误 "Required a bean of type ' java.lang.Class' 无法找到”

hibernate - 使用 Hibernate 问题持久化长字符串