Aktualisieren Sie die JPA -Entitätsgrafiken automatischJava

Java-Forum
Anonymous
 Aktualisieren Sie die JPA -Entitätsgrafiken automatisch

Post by Anonymous »

Stellen Sie sich vor, mein Backend-Put Endpunkt empfängt diesen UserRequestDTO :

Code: Select all

{
"id": 12345,
"name": "steve123",
"emailData": [
"steve@gmail.com",
"steve@outlook.com"
]
}
< /code>
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Getter
@Setter
public class UserRequestDto {

private Long id;
private String name;
private List emailData;
}
< /code>
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Entity
@Getter
@Setter
@Table(name = "\"user\"")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List emailData;
}
< /code>
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
@Table(name = "email_data")
public class EmailData {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
private String email;
}
< /code>
-- schema.sql
CREATE TABLE IF NOT EXISTS "user"
(
id                      BIGINT GENERATED BY DEFAULT AS IDENTITY,
name                    VARCHAR(500) UNIQUE NOT NULL,
PRIMARY KEY (id)
);

CREATE TABLE IF NOT EXISTS email_data
(
id                      BIGINT GENERATED BY DEFAULT AS IDENTITY,
user_id                 BIGINT NOT NULL REFERENCES "user"(id),
email                   VARCHAR(200) UNIQUE NOT NULL,
PRIMARY KEY (id)
);
< /code>
import com.example.pixel_user_api.data.dto.request.UserRequestDto;
import com.example.pixel_user_api.data.dto.response.UserResponseDto;
import com.example.pixel_user_api.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
public class UserController {

private final UserService userService;

@PutMapping
public ResponseEntity updateUser(@RequestBody UserRequestDto userRequestDto) {
UserResponseDto userResponseDto = userService.update(userRequestDto);
return ResponseEntity.ok(userResponseDto);
}
}
< /code>
Stellen Sie sich auch vor, Steves aktueller Zustand entspricht diesem: < /p>
{
"id": 12345,
"name": "steve123",
"emailData": [
"steve@gmail.com",
"steve@yahoo.com"
]
}
Hier ist, was mein Backend tun soll:

Halten Sie steve@gmail.com NIEMALS, es in E -Mail -_data -. Wenn es nicht von einem anderen Benutzer besetzt ist, geben Sie eine Fehlerantwort zurück (ich kann einen Rat schreiben, der die Fehler des DB in meinem spezifischen (einfachen) Szenario (einfach) Szenario mein Userservice < /code> kann: < /p>

alle STEVE -E -Mails (a db hit). Manipulieren Sie seine E-Mail-Data -Liste, damit nur Steve@gmail.com erhalten bleibt, Steve@outlook.com hinzugefügt wird (mit einer Null-ID und nicht null Benutzer ). Unverschämt.

Code: Select all

@Entity
@Getter
@Setter
@Table(name = "phone_data")
public class PhoneData {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
private String phone;
}
< /code>
Objektdiagramm könnte auch viel komplexer sein. Ein Value -Wrapper, wie EmailData 
, könnte auf einen anderen verweisen. Nehmen wir an, es verweist domainData .

Code: Select all

@Entity
@Getter
@Setter
@Table(name = "domain_data")
public class DomainData {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String domain; // outlook.com, gmail.com, etc.
}
Der Punkt ist, wenn ich all diese Details manuell verwalte, kann der Code schnell weitlich und schwer zu pflegen. Ein erstes Put wäre in Ordnung, aber wenn Sie versucht haben, denselben JSON erneut einzulegen, erhalten Sie einen eindeutigen Einschränkungsverstoß (da E-Mail in E-Mail_Data eindeutig ) sein.

Code: Select all

import com.example.pixel_user_api.data.dto.request.UserRequestDto;
import com.example.pixel_user_api.data.dto.response.UserResponseDto;

public interface UserService {

UserResponseDto update(UserRequestDto userRequestDto);
}
< /code>
import com.example.pixel_user_api.data.dto.request.UserRequestDto;
import com.example.pixel_user_api.data.dto.response.UserResponseDto;
import com.example.pixel_user_api.data.entity.User;
import com.example.pixel_user_api.mapper.UserMapper;
import com.example.pixel_user_api.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {

private final UserRepository repository;
private final UserMapper mapper;

@Override
@Transactional(readOnly = false)
public UserResponseDto update(UserRequestDto userRequestDto) {
User user = mapper.toUser(userRequestDto);
User updatedUser = repository.save(user);
return mapper.toResponseDto(updatedUser);
}
}
< /code>
import com.example.pixel_user_api.data.dto.request.UserRequestDto;
import com.example.pixel_user_api.data.dto.response.UserResponseDto;
import com.example.pixel_user_api.data.entity.User;
import org.mapstruct.Mapper;

@Mapper(uses = EmailMapper.class, componentModel = "spring")
public interface UserMapper {

User toUser(UserRequestDto userRequestDto);
UserResponseDto toResponseDto(User user);
}
< /code>
import com.example.pixel_user_api.data.entity.EmailData;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

@Mapper(componentModel = "spring")
public interface EmailMapper {

default String toString(EmailData emailData) {
return emailData == null ? null : emailData.getEmail();
}

@Mapping(source = ".", target = "email")
EmailData toEmailData(String email);
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post