我不明白在这种情况下“执行发布请求”是什么意思,但是您应该注意“OneToOne”注释的属性。如您所见,您指定了
@OnetoOne(cascade= {CascadeType.DETACH,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.REMOVE})
级联属性有 javadoc
(可选)必须级联到目标的操作
协会。默认情况下没有级联操作。
在您的情况下,对“车辆”实例的任何指定操作都会触发“设备”实例的更新(如果有必要)。
默认情况下,“OneToOne”注解也有 FetchType.EAGER。
(可选)关联是应该延迟加载还是必须急切获取。 EAGER 策略是对持久性提供程序运行时的要求,即必须急切地获取关联实体。 LAZY 策略是对持久性提供程序运行时的提示。
这意味着当您从数据库中获取“车辆”实体时,您将获取“设备”实体。所以hibernate会做2个选择,像这样:
select * from vehicle where id = :id
select * from device where device_id = :id
说说,hibernate 如何将类映射到数据库表。 Hibernate 可以将此结构映射到 2 个表。
create vehicle (
id
device_id
)
create device (
id
vehicle_id # if field "@OneToOne private Vehicle vehicle;" specified in "Device" class
)
最后,如果你想在“Vehicle”类中只有“deviceId”(而不是对象“Device”),你应该考虑去掉@OneToOne 并使用类似的东西
private Integer deviceId; // Without annotations
并手动管理它。
但是在这种情况下,不要忘记对关系“vehicle.device_id and device.id”创建外键约束,它可以帮助您避免数据不一致。