spring - 无法在多对多关系中获取实体 ID
问题描述
我在多对多关系中有两个实体,代理和客户映射如下。我在代理存储库端保留客户端实体,并且在保留客户端后无法获取客户端 ID。以下是实体定义
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Client extends AbstractAuditingEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany(mappedBy = "clients")
private Set<Agency> agencys = new HashSet<>();
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Client tag = (Client) o;
return Objects.equals(name, tag.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
和代理:
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Agency extends AbstractAuditingEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany(cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@JoinTable(name = "agency_client",
joinColumns = @JoinColumn(name = "agency_id"),
inverseJoinColumns = @JoinColumn(name = "client_id")
)
private Set<Client> clients = new HashSet<>();
public void addClient(Client client) {
clients.add(client);
client.getAgencys().add(this);
}
public void removeClient(Client client) {
clients.remove(client);
client.getAgencys().remove(this);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Agency)) return false;
return id != null && id.equals(((Agency) o).getId());
}
@Override
public int hashCode() {
return getClass().hashCode();
}
}
客户端创建方法:
@Override
@Transactional
public Long save(ClientCreateDto clientCreateDto) {
try {
Client client = new Client();
client.setName(clientCreateDto.getName());
Address address = new Address();
address.setFirstLine(clientCreateDto.getAddress().getFirstLine());
address.setTown(clientCreateDto.getAddress().getTown());
address.setPostcode(clientCreateDto.getAddress().getPostcode());
client.setAddress(address);
client.setEmail(clientCreateDto.getEmail());
client.setBillingEmail(clientCreateDto.getBillingEmail());
client.setTelephone(clientCreateDto.getTelephone());
client.setLogo(clientCreateDto.getLogo());
client.setCreatedBy("System");
client.setStatus(Status.ACTIVE);
client.setService(service.getOne(clientCreateDto.getServiceId()));
Agency agency = agencyService.getOne(clientCreateDto.getAgencyId());
agency.addClient(client);
agencyRepository.saveAndFlush(agency);
log.info("################### Client {}", client.toString());
return client.getId();
} catch (Exception exception) {
throw new BusinessValidationException(exception.getMessage());
}
}
我得到空值,而不是分配给客户端的 id。
解决方案
您必须首先持久化客户端对象。做这个,
@Override
@Transactional
public Long save(ClientCreateDto clientCreateDto) {
try {
Client client = new Client();
client.setName(clientCreateDto.getName());
Address address = new Address();
address.setFirstLine(clientCreateDto.getAddress().getFirstLine());
address.setTown(clientCreateDto.getAddress().getTown());
address.setPostcode(clientCreateDto.getAddress().getPostcode());
client.setAddress(address);
client.setEmail(clientCreateDto.getEmail());
client.setBillingEmail(clientCreateDto.getBillingEmail());
client.setTelephone(clientCreateDto.getTelephone());
client.setLogo(clientCreateDto.getLogo());
client.setCreatedBy("System");
client.setStatus(Status.ACTIVE);
client.setService(service.getOne(clientCreateDto.getServiceId()));
Agency agency = agencyService.getOne(clientCreateDto.getAgencyId());
//save client
Client savedClient = clientRepository.save(client);
agency.addClient(savedClient);
agencyRepository.saveAndFlush(agency);
log.info("################### Client {}", savedClient.toString());
return savedClient.getId();
} catch (Exception exception) {
throw new BusinessValidationException(exception.getMessage());
}
}
推荐阅读
- java - Nativescript Angular 应用程序因“java.lang.IllegalStateException:太多接收器,总共 1000 个,为 pid 注册”而中断
- python - AssertionError:“'str' 对象没有属性 'get'”
- c# - 当他们没有进一步的用户输入时,我想从 bot 发送一条消息“X 分钟后你在吗”
- sql - 如何删除测量中的所有记录,除了 InfluxDB 中的最后一条记录?
- angular - 我们可以在创建组件时在 app.routing.ts 中自动添加路由吗?
- amazon-web-services - aws quicksight 中的一项功能是从 quicksight 用户界面更新(放置数据)红移?
- python-3.x - 当所有其他列的值都相同时,将列的多行中的值折叠到一个数组中
- html - 如何显示包含 Vue 变量的动态 HTML?
- django - Django CRM 模块未正确显示导航菜单栏
- webrtc - 没有扩展的屏幕共享