【问题标题】:How to do OnetoOne mapping and I don't want to save data to its related table in hibernate [closed]如何进行 OnetoOne 映射,我不想将数据保存到休眠中的相关表 [关闭]
【发布时间】:2022-01-22 15:54:13
【问题描述】:

我有 2 张桌子、车辆和设备

我想在休眠状态下执行一个发布请求,并且不想将数据保存在其相应的设备表中。但我想获取设备表的现有 ID 并存储到车辆表中。 谁能帮我解决这个问题?

@ENTITY
class vehicle{

@ID
@GeneratedValue(strategy= GeneratedType.IDENTITY)
int id;

@OnetoOne(cascade= {CascadeType.DETACH,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.REMOVE})
private Device deviceid;
}

【问题讨论】:

    标签: java hibernate jpa entity


    【解决方案1】:

    我不明白在这种情况下“执行发布请求”是什么意思,但是您应该注意“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”创建外键约束,它可以帮助您避免数据不一致。

    【讨论】:

      猜你喜欢
      • 2014-12-27
      • 1970-01-01
      • 2014-03-12
      • 2016-03-18
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      相关资源
      最近更新 更多