Java 为什么';从@Transactional方法(Spring boot)返回对象时,Hibernate是否完全解析对象?
我的serviceImpl.java类中有一个包含这一行的方法: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();
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
将启动自己的事务)。这个私有方法很好。