我用spring boot创建了一个小项目。
应用程序将拥有不同类型的用户,在注册的第一阶段(帐户实体),每个用户都必须使用所有用户应具有的公共字段来填写表单。
第一阶段用户将注册到数据库后,他可以登录到该应用程序。
在注册的第一阶段,用户应选择角色。
应用程序应具有的角色:
注册完成后,用户将登录该应用程序,他将根据先前的角色选择查看包含供应商或产品消费者字段的表单。
我的问题是:
春季启动中最好的/干净的解决方案是什么,从专业用户的第一阶段组成普通用户实体?
发布于 2018-09-27 14:45:35
在第一步中,已经提到用户将拥有一个通用帐户:
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Entity
@DiscriminatorColumn(name = "role")
public class Account {
@Id
private String id;
private String firstName;
private String lastName;
@Transient
@JsonIgnore
public String getRole(){
return null;
}
//getters and setters
}
这个实体是独立的,所以它不需要是一个抽象类。下一步是创建专用帐户:
@Entity
@DiscriminatorValue(ROLE_CLIENT)
public class ClientAccount extends Account {
public static final String ROLE_CLIENT = "ROLE_CLIENT";
// specific client stuff
@Override
public String getRole() {
return ROLE_CLIENT;
}
}
@Entity
@DiscriminatorValue(ROLE_SUPPLIER)
public class SupplierAccount extends Account {
public static final String ROLE_SUPPLIER = "ROLE_SUPPLIER";
// specific supplier stuff
@Override
public String getRole() {
return ROLE_SUPPLIER;
}
}
第一步:
Account user = new Account();
user.setId("123");
user.setFirstName("FirstName");
user.setLastName("LastName");
accountRepository.save(user);
第二步:
public <T> T convertAccount(Account account, Class<? extends Account> newAccountType) throws IOException {
if (account.getRole() != null) {
throw new IllegalArgumentException("Cannot convert a specialized account");
}
ObjectMapper objectMapper = new ObjectMapper();
return (T) objectMapper.readValue(objectMapper.writeValueAsBytes(account), newAccountType);
}
@Transactional
public void updateAccount(Account account) {
accountRepository.deleteById(account.getId());
accountRepository.save(account);
}
示例;
Optional<Account> targetAccount = accountRepository.findById("123");
updateAccount(convertAccount(targetAccount.get(), ClientAccount.class));
https://stackoverflow.com/questions/-100002767
复制相似问题