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);
}
}
你会如何实际上,为了实现前面提到的行为,你认为哪一个是最佳实践?
- 在将 Driver 插入数据库之前(在前面提到的代码块中)手动创建
Car
实体并将其分配给 driver,或者
- 使用
@RepositoryEventHandler
之类的东西来拦截何时 Driver
实体将被插入数据库并在那里更新它们之间的 link。
- 其他 (...)?
此外,如果我们扩大规模并且我们还必须将 House
和 VacationHouse
分配给 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;
}
通过这种设计,您可以简单地创建带有属性的汽车或房屋,这些属性可以是门或轮胎等属性。
只需在创建驱动程序时插入,然后只需将 属性 添加到该驱动程序即可,可以是任何内容。此外,您还需要 属性 和分配给用户的另一个端点。它比创建驱动程序时插入更灵活。
软件开发人员大家好,
假设我们有以下场景:我们有一个系统,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);
}
}
你会如何实际上,为了实现前面提到的行为,你认为哪一个是最佳实践?
- 在将 Driver 插入数据库之前(在前面提到的代码块中)手动创建
Car
实体并将其分配给 driver,或者 - 使用
@RepositoryEventHandler
之类的东西来拦截何时Driver
实体将被插入数据库并在那里更新它们之间的 link。 - 其他 (...)?
此外,如果我们扩大规模并且我们还必须将 House
和 VacationHouse
分配给 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;
}
通过这种设计,您可以简单地创建带有属性的汽车或房屋,这些属性可以是门或轮胎等属性。
只需在创建驱动程序时插入,然后只需将 属性 添加到该驱动程序即可,可以是任何内容。此外,您还需要 属性 和分配给用户的另一个端点。它比创建驱动程序时插入更灵活。