首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法获取ManyToMany关系上的实体id

无法获取ManyToMany关系上的实体id
EN

Stack Overflow用户
提问于 2021-10-04 19:40:41
回答 1查看 21关注 0票数 0

我在ManyToMany关系中映射了两个实体,代理和客户端,如下所示。我在agencyrepository端持久化客户端实体,在持久化客户端之后,我无法获得客户端id。以下是实体定义

代码语言:javascript
复制
@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);
    }

}

和代理:

代码语言:javascript
复制
@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();
    }

   
}

用于创建客户端的MEthod:

代码语言:javascript
复制
@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());
        }

    }

我得到的是null,而不是分配给客户端的id。

EN

回答 1

Stack Overflow用户

发布于 2021-10-05 11:07:08

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

代码语言:javascript
复制
@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());
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69441539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档