如何使用 lombok builder 更新实体?

How update entity using lombok builder?

唯一不起作用的方法是更新。我的资源码:

@Path("/campaigns")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class CampaignResource {

    @Inject
    CampaignService campaignService;

    // ...

    @PUT
    @Transactional
    @Path("{id}")
    public Optional<Campaign> update(@PathParam("id") UUID id, Campaign entity) {
        return campaignService.updateCampaign(id, entity);
    }

    // ...

  }

服务代码:

@ApplicationScoped
public class CampaignService {

    // ...

    @Inject
    CampaignRepository campaignRepository;

    public Optional<Campaign> updateCampaign(UUID id, Campaign entity) {
        return campaignRepository.update(id, entity);
    }

    // ...
}

存储库代码:

@ApplicationScoped
public class CampaignRepository implements BaseRepository<Campaign> {

    // ...

    public Optional<Campaign> find(final UUID id) {
        return Optional.ofNullable(findById(id));
    }

    public Optional<Campaign> update(final UUID id, final Campaign entityUpdate) {
        return find(id).map(entity -> entity.toCampaign(entityUpdate));
    }

    // ...

}

Domain/Entity代码:

@Data
@NoArgsConstructor
@Accessors(chain = true)
@EqualsAndHashCode(of = {"id"})

@Entity
@Table(name = "core_campaign")
public class Campaign {

    @Id
    @GeneratedValue
    private UUID id;

    @NotNull
    @Size(min = 3, max = 100)
    @Column(length = 50, nullable = false)
    public String name;

    // ...

    @Builder
    public Campaign(final UUID id, final String name/**, ... */) {
        this.id = id;
        this.name = name;
        // ...
    }

    public Campaign toCampaign(Campaign entity) {
        return Campaign.builder()
            .name(entity.getName())
            // ...
            .build();
    }

}

是的,我的错误是坚持的时候,帮我解决一下。

我认为问题在于您从未真正更新实体。您从数据库中获取实体,然后您 return 从实体内部的构建器中获取一个新实例,但所获取实体的字段永远不会更新。

据我所知,你有两个选择:

  1. 您可以从“toCampaign()”函数
  2. 对returned Campaign 对象调用repository.save(returnedCampaign)
  3. 您可以在 Campaign 对象中创建更新方法,类似于

这个:

public Campaign update(Campaign entity) {
    this.name = entity.getName()
    // ...
    return this;
}

由于这是在@Transactional 内部发生的,因此您对实体所做的更改应该会自动存储。