[英]Design Pattern to a better update on Spring boot REST API
I have created a REST API using Java with Spring boot, i'm new using Design Patterns but i need to improve my ppdate method to verify all information on my Atlete entity.
我的实体是关于 atletes 信息的:
@Getter
@Setter
@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Table(name = "atletes", schema = "personas")
public class Atlete {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_atlete")
private Long idAtlete;
@Lob
@Type(type = "org.hibernate.type.TextType")
@Column(name = "atlete_name")
private String atleteName;
@Temporal(TemporalType.DATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
@Column(name = "date_birth")
private Date dateBirth;
@Column(name = "atlete_height")
private Double atleteHeight;
@Column(name = "atlete_weight")
private Double atleteWeight;
@Column(name = "atlete_imc")
private Double atleteImc;
@Lob
@Type(type = "org.hibernate.type.TextType")
@Column(name = "atlete_bid")
private String atleteBid;
@Enumerated(EnumType.STRING)
@Column(name = "dominant_leg")
private DominantLeg dominantLeg;
@Enumerated(EnumType.STRING)
@Column(name = "position")
private Position position;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_adress")
private Adress adress;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_contact")
private Contact contact;
@JsonProperty("atleteClubs")
@OneToMany(fetch = FetchType.LAZY, mappedBy = "atlete", cascade = CascadeType.REMOVE)
private List<AtleteClub> atleteClubs;
@Lob
@Type(type = "org.hibernate.type.TextType")
@Column(name = "atlete_deceases")
private String deceases;
我的 AtleteController 上的 PUT 申请:
@PutMapping(value = URL_SINGULAR, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<AtleteDTO> updateAtlete(@PathVariable Long id, @RequestBody @Valid AtleteDTO atleteDTO) {
Optional<Atlete> verifyId = atleteRepository.findById(id);
if (verifyId.isPresent()) {
Atlete updatedAtlete = atleteService.desconvertObject(atleteDTO);
Atlete atlete = atleteService.update(id, updatedAtlete, atleteRepository);
return ResponseEntity.ok(new AtleteDTO(atlete));
}
return ResponseEntity.notFound().build();
}
在我的 AtleteService 上,我正在验证我的变量和对象是否已更新,如下所示:
@Transactional
public Atlete update(Long id, Atlete updated, AtleteRepository atleteRepository) {
Atlete saved = atleteRepository.findByidAtlete(id);
if (updated.getAtleteName() != null && !updated.getAtleteName().equals(saved.getAtleteName())) {
saved.setAtleteName(updated.getAtleteName());
}
if (updated.getDateBirth() != null && !updated.getDateBirth().equals(saved.getDateBirth())) {
saved.setDateBirth(updated.getDateBirth());
}
if (updated.getAtleteHeight() != null && !updated.getAtleteHeight().equals(saved.getAtleteHeight())) {
saved.setAtleteHeight(updated.getAtleteHeight());
}
if (updated.getAtleteWeight() != null && !updated.getAtleteWeight().equals(saved.getAtleteWeight())) {
saved.setAtleteWeight(updated.getAtleteWeight());
}
if (updated.getAtleteImc() != null && !updated.getAtleteImc().equals(saved.getAtleteImc())) {
saved.setAtleteImc(updated.getAtleteImc());
}
if (updated.getAtleteBid() != null && !updated.getAtleteBid().equals(saved.getAtleteBid())) {
saved.setAtleteBid(updated.getAtleteBid());
}
if (updated.getDominantLeg() != null && !updated.getDominantLeg().equals(saved.getDominantLeg())) {
saved.setDominantLeg(updated.getDominantLeg());
}
if (updated.getPosition() != null && !updated.getPosition().equals(saved.getPosition())) {
saved.setPosition(updated.getPosition());
}
if (updated.getContact() != null && !updated.getContact().equals(saved.getContact())) {
saved.setContact(contactService.update(updated.getContact().getId(), updated.getContact(), contactRepository));
}
if (updated.getAdress() != null && !updated.getAdress().equals(saved.getAdress())) {
saved.setAdress(adressService.update(updated.getAdress().getId(), updated.getAdress(), adressRepository));
}
if (updated.getAtleteClubs() != null && !updated.getAtleteClubs().isEmpty()) {
for (AtleteClub atleteClub : updated.getAtleteClubs()) {
atleteClubService.update(atleteClub.getId(), atleteClub,atleteClubRepository);
}
}
if (updated.getDeceases() != null && !updated.getDeceases().equals(saved.getDeceases())) {
saved.setDeceases(updated.getDeceases());
}
return saved;
}
是否有一些设计模式或 Spring 实用程序可以在不验证我的实体的每个变量和 object 的情况下进行更新? 如果我有 50 个变量,我需要像这样验证所有变量吗?
我记得我有一个类似的问题,我使用了反射,这是最简单的方法。
遍历第一个 object 的属性,得到另一个 object 的完全相同的属性并进行比较。
例子:
public static void main(String[] args) throws IllegalAccessException {
TestClass testObject1 = new TestClass();
testObject1.setId(1L);
testObject1.setName("TestObject1");
TestClass testObject2 = new TestClass();
testObject2.setId(2L);
testObject2.setName("TestObject2");
for (Field field : testObject1.getClass().getDeclaredFields()) {
boolean accessibleValue = field.isAccessible();
field.setAccessible(true);
Object otherValue = field.get(testObject2);
if (!field.get(testObject1).equals(otherValue))
field.set(testObject1, otherValue);
field.setAccessible(accessibleValue);
}
System.out.println(testObject1);
}
public static class TestClass {
private long id;
private String name;
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "TestClass{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
Output:
TestClass{id=2, name='TestObject2'}
也许您需要的是 Spring 数据 JPA 提供的 @DynamicUpdate 注释。
@DynamicUpdate 是一个类级别的注释,可以应用于 JPA 实体。 它确保 Hibernate 仅使用它为更新实体而生成的 SQL 语句中的修改列。
我直接从下面的参考链接中引用了它,请查看参考链接以获取更多详细信息。
参考链接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.