Spring - 如何在插入另一个实体(One-To-One 关系)时自动在数据库中插入一个实体?

Spring - how to automatically insert an entity in the database when inserting another (One-To-One relationship)?

软件开发人员大家好,

假设我们有以下场景:我们有一个系统,drivers 可以注册。 每次新的 Driver 注册时,系统 自动 构建 并将 Car 分配给 driver .

让我们考虑一下我们有以下 rest 控制器,它公开了一个端点供 drivers 在系统中注册:

@RestController
@RequestMapping("/api/register")
public class DriverController {

    ...

    @PostMapping
    public User register(@RequestParam String email, [...]) {
        final Driver driver = new Driver(email);
        ...
        return repository.save(driver);
    }
}

你会如何实际上,为了实现前面提到的行为,你认为哪一个是最佳实践?

  1. 在将 Driver 插入数据库之前(在前面提到的代码块中)手动创建 Car 实体并将其分配给 driver,或者
  2. 使用 @RepositoryEventHandler 之类的东西来拦截何时 Driver 实体将被插入数据库并在那里更新它们之间的 link。
  3. 其他 (...)?

此外,如果我们扩大规模并且我们还必须将 HouseVacationHouse 分配给 Driver,会发生什么情况。现在 Car 应该还有一个 Garage 和一个 Service History,而 House 可以有 CleaningTeam 等等...

首先你需要根据你的需要设计你的数据库。如果您想为房屋、汽车等创建 table... 那么如果它是一对一映射或一对多映射,您可以只保留数据标识符。多对多需要多一个 table 用于映射。

让我们看看如何保留标识符。 伪代码:

@Entity
class Driver {
   @OneToMany
   List<Car> cars;
   @OneToMany
   List<House> houses;
}


@Entity
class Driver {
   @OneToOne
   Car car;
   @OneToOne
   House house;
}

@Entity
class Driver {
// It can be Car or House it does not matter.
   private String entityIdentifier;
}

我猜你可以定义更灵活的方式。只需为 Car、House 等创建一个 table(maybe 属性 table) 并为 Car、House 等的属性创建另一个 table。 Driver实体中可以保留属性实体,尽量简单

@Entity
class Driver {
   @OneToMany
   List<Propert> property;
}
@Entity
class Property {
   // It can be House, Car, etc
   private String type;
   @OneToMany
   private List<Attribute> attributes;
}

@Entity
class Attribute {
    private String key;
    private String value;
}

通过这种设计,您可以简单地创建带有属性的汽车或房屋,这些属性可以是门或轮胎等属性。

只需在创建驱动程序时插入,然后只需将 属性 添加到该驱动程序即可,可以是任何内容。此外,您还需要 属性 和分配给用户的另一个端点。它比创建驱动程序时插入更灵活。