Jackson сериализация по id

84
28 сентября 2021, 06:20

Есть 2 обьекта

   @Entity
@Table(name = "real_estate", schema="data1c")
@Proxy(lazy = false)
public class RealEstate {
    @Id
    @Column(name = "id")
    UUID id;
    @Column(name = "name")
    String name;
    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
    @JoinColumn(name="city", nullable = false)
    private City city;
    @Column(name = "website")
    String website;
    @Column(name = "logo")
    String logo;
    @Column(name = "logo_web")
    String logoWeb;
    @Column(name = "foto")
    String foto;
    @Column(name = "foto_web")
    String fotoWeb;
    @Column(name = "longitude")
    Double longitude;
    @Column(name = "latitude")
    Double latitude;

    public UUID getId() {
        return id;
    }
    public void setId(UUID id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public City getCity() {
        return city;
    }
    public void setCity(City city) {
        this.city = city;
    }
    public String getWebsite() {
        return website;
    }
    public void setWebsite(String website) {
        this.website = website;
    }
    public String getLogo() {
        return logo;
    }
    public void setLogo(String logo) {
        this.logo = logo;
    }
    public String getLogoWeb() {
        return logoWeb;
    }
    public void setLogoWeb(String logoWeb) {
        this.logoWeb = logoWeb;
    }
    public String getFoto() {
        return foto;
    }
    public void setFoto(String foto) {
        this.foto = foto;
    }
    public String getFotoWeb() {
        return fotoWeb;
    }
    public void setFotoWeb(String fotoWeb) {
        this.fotoWeb = fotoWeb;
    }
    public Double getLongitude() {
        return longitude;
    }
    public void setLongitude(Double longitude) {
        this.longitude = longitude;
    }
    public Double getLatitude() {
        return latitude;
    }
    public void setLatitude(Double latitude) {
        this.latitude = latitude;
    }

    @Override
    public String toString() {
        return "RealEstate{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", city=" + city +
                ", website='" + website + '\'' +
                ", logo='" + logo + '\'' +
                ", logoWeb='" + logoWeb + '\'' +
                ", foto='" + foto + '\'' +
                ", fotoWeb='" + fotoWeb + '\'' +
                ", longitude=" + longitude +
                ", latitude=" + latitude +
                '}';
    }
}

Обьект City:

@Entity
@Table(name = "city", schema="data1c")
@Proxy(lazy = false)
public class City  {
    @Id
    @Column(name = "id")
    private UUID id;
    @Column(name = "name")
    private String name;
    public UUID getId() {
        return id;
    }
    public void setId(UUID id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "City{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

мне нужно забрать данные с апи и залить в базу.

Пример json такой :

 {
            "id": "c67ec057-ea71-11e5-b9a5-b4b52f5405e7",
            "name": "Проект очереди 1",
            "city": "a4874e7c-2906-11e9-80d9-00155d101f25",
            "website": "",
            "logo": "",
            "logoWeb": "",
            "foto": "",
            "fotoWeb": "",
            "longitude": 0,
            "latitude": 0
        }

Проблема в том что city приходит не как обьект а как id(идентификатор). как мне сериализовать? Помогите

Пытаюсь примерно так:

public RealEstate serializerealrest() throws IOException {
        String body = "{\n" +
                "            \"id\": \"c67ec057-ea71-11e5-b9a5-b4b52f5405e7\",\n" +
                "            \"name\": \"Проект очереди 1\",\n" +
                "            \"city\": \"a4874e7c-2906-11e9-80d9-00155d101f25\",\n" +
                "            \"logo\": \"\",\n" +
                "            \"logoWeb\": \"\",\n" +
                "            \"foto\": \"\",\n" +
                "            \"fotoWeb\": \"\",\n" +
                "            \"longitude\": 0,\n" +
                "            \"latitude\": 0\n" +
                "        }";
        RealEstate realEstate = mapper.readValue(body, new TypeReference<RealEstate>(){});
        return realEstate;
    }
Answer 1

есть множество вариантов. например, достаточно проставить специальные аннотации, которые укажут сериализатору, что именно и куда парсить. для юида города добавим отдельное поле, которое не будем сохранять в бд, однако покажем его нашему сериализатору. и откройте для себя ломбок, сколько можно писать геттры, сеттеры и прочую ерунду? зависимость для градла: compileOnly 'org.projectlombok:lombok:1.18.8'

выглядит это так

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.UUID;
import javax.persistence.*;
@Entity
@Table(name = "real_estate", schema="data1c")
@Proxy(lazy = false)
@lombok.Data
@lombok.experimental.FieldDefaults(level = lombok.AccessLevel.PRIVATE)
public class RealEstate {
    @Id
    @Column(name = "id")
    @JsonProperty(value = "id")
    UUID id;
    @JsonProperty(value = "name")
    @Column(name = "name")
    String name;    
    @JsonProperty(value = "website")
    @Column(name = "website")
    String website;    
    @JsonProperty(value = "logo")
    @Column(name = "logo")
    String logo;    
    @JsonProperty(value = "logoWeb")
    @Column(name = "logo_web")
    String logoWeb;    
    @JsonProperty(value = "foto")
    @Column(name = "foto")
    String foto;    
    @JsonProperty(value = "fotoWeb")
    @Column(name = "foto_web")
    String fotoWeb;    
    @JsonProperty(value = "longitude")
    @Column(name = "longitude")
    Double longitude;
    @JsonProperty(value = "latitude")
    @Column(name = "latitude")
    Double latitude;
    @JsonIgnore
    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
    @JoinColumn(name="city", nullable = false)
    private City city;
    @JsonProperty(value = "city")
    @Transient
    private UUID cityId;
}
READ ALSO
Триггер в MySql не работает

Триггер в MySql не работает

я новичок в MySql, написал такой код:

139
В MySQL как правильно записать TimeStamp=Timestamp + DateTime

В MySQL как правильно записать TimeStamp=Timestamp + DateTime

В хранимой процедуре MySQL есть две переменныеВ одной хранится в формате TimeStamp время регистрации,например '2020-01-15 14:30:33'

140
Вопрос по связи триггера и базы данных

Вопрос по связи триггера и базы данных

Есть вот такая скромная бд:

192
Посоветуйте базу данных для хранения больших таблиц

Посоветуйте базу данных для хранения больших таблиц

Какая бд лучше справиться с хранением больших таблиц, +30-50GИз вариантов MySQL 8

188