如何使用 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 从实体内部的构建器中获取一个新实例,但所获取实体的字段永远不会更新。
据我所知,你有两个选择:
- 您可以从“toCampaign()”函数
对returned Campaign 对象调用repository.save(returnedCampaign)
- 您可以在 Campaign 对象中创建更新方法,类似于
这个:
public Campaign update(Campaign entity) {
this.name = entity.getName()
// ...
return this;
}
由于这是在@Transactional 内部发生的,因此您对实体所做的更改应该会自动存储。
唯一不起作用的方法是更新。我的资源码:
@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 从实体内部的构建器中获取一个新实例,但所获取实体的字段永远不会更新。
据我所知,你有两个选择:
- 您可以从“toCampaign()”函数 对returned Campaign 对象调用repository.save(returnedCampaign)
- 您可以在 Campaign 对象中创建更新方法,类似于
这个:
public Campaign update(Campaign entity) {
this.name = entity.getName()
// ...
return this;
}
由于这是在@Transactional 内部发生的,因此您对实体所做的更改应该会自动存储。