Lis*_*sek 6 spring-boot spring-data-jdbc spring-data-r2dbc r2dbc
我正在探索在使用 Spring Data R2DBC 时设计一对一和一对多关系时可能的想法。
由于 Spring Data R2DBC 本身仍然不支持关系,因此仍然需要我们自己处理这些关系(与 Spring Data JDBC 不同)。
我想象的是,当涉及到一对一映射时,实现可能如下所示:
@Table("account")
public class Account {
@Id
private Long id;
@Transient // one-to-one
private Address address;
}
Run Code Online (Sandbox Code Playgroud)
@Table("address")
public class Address {
@Id
private Integer id;
}
Run Code Online (Sandbox Code Playgroud)
而数据库模式定义如下:
--address
CREATE TABLE address
(
id SERIAL PRIMARY KEY
)
--account
CREATE TABLE account
(
id SERIAL PRIMARY KEY,
address_id INTEGER REFERENCES address(id)
)
Run Code Online (Sandbox Code Playgroud)
由于该Account对象是我的聚合根,我想我应该Address按照 Jens Schaduer 的建议加载该对象:
聚合是形成一个单元的一组对象,它应该始终保持一致。此外,它应该始终被持久化(并加载)在一起。来源:Spring Data JDBC、参考资料和聚合
这让我想到,在像这样的一对一关系的情况下,我实际上应该Account像这样定义我的实体:
@Table("account")
public class Account {
@Id
private Long id;
@Transient // one-to-one
private Address address;
@Column("address_id")
private Integer addressId;
}
Run Code Online (Sandbox Code Playgroud)
然后使用以下内容重新创建完整的Account聚合实体Address:
@Service
public class AccountServiceImpl implements AccountService {
private final AccountRepository accountRepository;
private final AddressRepository addressRepository;
public AccountServiceImpl(AccountRepository accountRepository,
AddressRepository addressRepository) {
this.accountRepository = accountRepository;
this.addressRepository = addressRepository;
}
@Override
public Mono<Account> loadAccount(Integer id) {
return accountRepository.getAccountById(id)
.flatMap(account ->
Mono.just(account)
.zipWith(addressRepository.getAddressByAccountId(account.getAddressId()))
.map(result -> {
result.getT1().setAddress(result.getT2());
return result.getT1();
})
);
}
}
Run Code Online (Sandbox Code Playgroud)
如果不是这种情况,那么在使用 Spring Data R2DBC 时我还应该如何处理一对一关系?
我认为你的做法是合理的。只有几个挑剔的地方:
map?| 归档时间: |
|
| 查看次数: |
5503 次 |
| 最近记录: |