首页 > 解决方案 > 无法在多对多关系中获取实体 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。

标签: springhibernatejpatransactionsmany-to-many

解决方案


您必须首先持久化客户端对象。做这个,

@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());
    }

}

推荐阅读