Spring JPA Update не работает на вложенных объектах - PullRequest
0 голосов
/ 25 мая 2018


У меня проблема с обновлением данных моей базы данных с помощью Spring rest JPA (метод PUT).

Когда я выполняю запрос POST для вставки данных, он работает отлично, все мои данные вставляются правильно, однако, когда я пытаюсь обновить свои данные с помощью PUT, событие Name is updated inбаза данных, но не GeometryBasic, я попытался записать ее значение. Оно изменяется правильно, но не в базе данных, hibernate не сохраняет новые значения данных.У меня есть следующие занятия:

Местоположение

@Data
@Entity
@Table(name="sw_locations")
public class Location {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Location_Generator")
    @SequenceGenerator(name="Location_Generator", sequenceName = "Location_Sequence")
    private Long id;

    @Column(name = "latitude")
    private Double latitude;

    @Column(name = "longitude")
    private Double longitude;

    @Column(name = "x")
    private Double x;

    @Column(name = "y")
    private Double y;


    @ManyToOne @JoinColumn(name="multi_id") @JsonIgnore
    private MultiBasic multi;

    public boolean isEmpty() {
        boolean hasNoPointCoord = (this.getLatitude() ==null && this.getLongitude() == null);
        return  hasNoPointCoord;
    }

    @Override
    public String toString() {
        return "Location [point="+this.getX()+" : "+this.getY()+" : "+this.getLatitude() +" : "+ this.getLongitude() + "]";
    }

}

Мульти

public class Multi extends ArrayList<Location>{
//Some methods

}

Геометрия

public class Geometry extends ArrayList<Multi>{
    //Some Methods
}

GeometryBasic

@Data
@Entity
@Table(name="sw_geometries")
public class GeometryBasic{

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Geometry_Generator")
    @SequenceGenerator(name="Geometry_Generator", sequenceName = "Geometry_Sequence")
    private long id;

    @OneToMany(mappedBy="geometry",
               cascade= CascadeType.ALL, fetch=FetchType.LAZY)
    private List<MultiBasic> multies = new ArrayList<MultiBasic>();

    //some other methods
}

MultiBasic

@Data
@Entity
@Table(name="sw_multis")
public class MultiBasic{

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Multi_Generator")
    @SequenceGenerator(name="Multi_Generator", sequenceName = "Multi_Sequence")
    private long id;

    @ManyToOne @JoinColumn(name="geometry_id") @JsonIgnore
    private GeometryBasic geometry;


    @OneToMany(mappedBy="multi",
               cascade= CascadeType.ALL,fetch=FetchType.LAZY)
    private List<Location> locations = new ArrayList<Location>();

}

GeometryHelper

public class GeometryHelper {

     public static Geometry map(GeometryBasic geom) {


         //Check if geometry object is defined and contains multies
        if(geom == null || geom.isEmpty())
            return null;

        Geometry geometry = new Geometry();

        //Map nested collections into 2D Array.
        geom.getMulties().forEach(m->{
            Multi multi  = new Multi();
            multi.addAll(m.getLocations());
            geometry.add(multi);
        });

        return geometry;
    }

     public static GeometryBasic mapToBasic (Geometry geom) {


         //Check if geometry object is defined and contains multies
        if(geom == null)
                return null;
        GeometryBasic geometry = new GeometryBasic();
        List<MultiBasic> multis = new ArrayList<MultiBasic>();

        //Iterate over multis to add link to geometry 
        geom.forEach(m ->{
            MultiBasic multi = new MultiBasic();
            List<Location> locations = new ArrayList<Location>();

            //iterate over locations to add link to Multi
            m.forEach( l -> {
                l.setMulti(multi);
                locations.add(l);
            });

            multi.setLocations(locations);
            multi.setGeometry(geometry);
            multis.add(multi);
        });

        geometry.setMulties(multis);

        return geometry;
     }

}

Класс

@MappedSuperclass
public abstract class AbstractEntityWithNameTitleLocation extends AbstractEntityWithNameTitle {

    @Column(name="entity_name")
    private String name;


    @OneToOne(fetch = FetchType.EAGER, cascade= CascadeType.ALL) @JoinColumn(name = "id_geometry")  @JsonIgnore
    private GeometryBasic geometryBasic;

    public GeometryBasic getGeometryBasic() {
        return this.geometryBasic;
    }

    public void setBasicGeometry(GeometryBasic geometry) {
        this.geometryBasic = geometry;
    }

    @Transient
    Geometry geometry;

    //Return the transformed object basic geometry
    public Geometry getGeometry() {
        return GeometryHelper.map(this.geometryBasic);
    }

    //Return the transformed object basic geometry
    public void setGeometry(Geometry geom) {
        this.setBasicGeometry(GeometryHelper.mapToBasic(geom));
    }
}

1 Ответ

0 голосов
/ 26 июля 2019

Я столкнулся с той же проблемой.PUT для вложенных объектов не работает.Однако POST и PATCH работали нормально.

Просто замените ваш HTTP-глагол с PUT на PATCH.Исправление всех полей вашего ресурса (тело запроса будет таким же, как если бы вы использовали PUT) будет происходить так же, как если бы вы были PUT ресурса.

Может быть, это ошибка в Spring Data Rest?

Может быть связано: Spring Data REST - запрос PUT не работает должным образом, начиная с v.2.5.7

...