我有两个实体,它们通过一对一的映射连接我只想保存一个实体数据并获取另一个实体的现有 ID 和映射

Posted

技术标签:

【中文标题】我有两个实体,它们通过一对一的映射连接我只想保存一个实体数据并获取另一个实体的现有 ID 和映射【英文标题】:I have two entity they are connected by one to one mapping i want to save only one entity data and get the existing id of another entity and map 【发布时间】:2022-01-23 10:35:02 【问题描述】:

我有两个实体,它们通过 OnetoOne 映射连接我只想保存一个实体数据并获取另一个实体的数据并将其主键存储在我们的表中,请问我该怎么做?

@Entity
class Vehicle

@Id
@GeneratedValue(statergy=GenerationType.IDENTITY)
private int id;

@OneToOne
@JoinColumn(name="device_id",referencedColumnName = "id")
private Device deviceId;

【问题讨论】:

【参考方案1】:

如果您的意思是要将车辆保存在数据库中并且外键不为空(这意味着您要保存在数据库中的车辆将有一个映射到它的设备),您可以通过以下方式做到这一点: 在数据库中找到设备,然后创建一个新的车辆对象(将 id 保留为空,bcs 将在您将其保存在数据库中时自动生成)。 之后,只需使用设置器将设备设置到车辆中。 (例如:vehicle.setDevice(theDeviceObjecYouGotFromTheDatabase))。

实现它的方法是这样的: 注意:建议使用 VehicleDTO,但我对其进行了简化。为了更清楚,我还为这些对象使用了一些奇怪的名称。

public Vehicle saveVehicle(Vehicle vehicleToBeSaved, Long deviceId) 
    Device deviceThatWasInDb = this.deviceRepository.findById(deviceId)
            .orElseThrow(() -> 
                throw new EntityNotFoundException("Device with this id was not in the db");
            );
    // assuming that the vehicleToBeSaved has null id, you just need to use a setter to set the device field
    vehicleToBeSaved.setDevice(deviceThatWasInDb);

    Vehicle vehicleAfterBeingSaved = this.vehicleRepository.save(vehicleToBeSaved);

    return vehicleAfterBeingSaved;

我假设我们在服务层,并且您已经创建了 VehicleRepository 和 DeviceRepository。

希望这会有所帮助。

【讨论】:

我们如何通过编码来做你能解释一下,因为我尽力了,但它没有发生我们已经在数据库中有设备详细信息它将如何自动映射我们有新车我们必须映射该设备到车辆? 好的,我会用一个例子来编辑答案。我假设您获取了 Vehicle 对象和您想要映射到该车辆的设备的 ID,作为参数。 非常感谢它的帮助我想知道设备 ID 进入 Requestbody 或 RequestParam 的另一件事 这取决于您希望如何构建端点。在示例中,我假设它是一个请求参数(例如:POST /deviceId/vehicle),但是您可以使它来自请求正文。假设您有一个 VehicleCreateRequest 类,其中包含新车辆实体的字段和您希望这辆新车辆拥有的设备 ID 的字段。前端会将此类作为请求发送,在服务层中,您将字段提取到 Vehicle 对象中并获取设备 ID。 感谢它对我有很大帮助,非常感谢

以上是关于我有两个实体,它们通过一对一的映射连接我只想保存一个实体数据并获取另一个实体的现有 ID 和映射的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core - 如何处理相关实体映射和保存

如果同时保存的两个实体父子实体映射为一对多关系,则抛出 id not found 父类异常

JPA的一对多,多对多用法

Hibernate多表关系配置——一对一关系映射

关于JPA一对一,一对多(多对一),多对多的详解

如何在 JpaRepository 中为多对一映射实体编写查询