Отношение Spring Boot возвращает ноль - PullRequest
0 голосов
/ 29 октября 2018

У меня проблема с отношением Spring Boot. Проблема возникает, когда метод create возвращает метод read (NullPointerException), поскольку он не может получить доступ к методу из объекта, который находится в отношении один к одному с классом проекта (project.getColors (). GetValue ()).

package Main.Controller;

import Main.Model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/project")
public class ProjectController {

@Autowired
private ProjectRepository projectRepository;

@RequestMapping(path = "/create", method = RequestMethod.POST)
@ResponseBody
public Object create(@RequestBody CreateProjectObject object) {

    Project project=new Project();
    project.setName(object.getName());
    project.setColor(object.getValue());
    projectRepository.save(project);
    return this.read();
}

@RequestMapping(path = "/read", method = RequestMethod.GET)
@ResponseBody
public List<Map<String, Object>> read() {
    List<Map<String, Object>> readProject = new ArrayList<>();

    for (Project project: projectRepository.findAll()
    ) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("value", project.getId());
        map.put("color", project.getColors().getValue());//           <--------
        map.put("label", project.getName());
        readProject.add(map);
    }
    return readProject;
}

Но дело в том, что метод read читает все другие проекты, которые были созданы ранее, без проблем. И если я вызываю этот метод несколько секунд спустя, он читает те же проекты, которые не мог прочитать несколько мгновений назад. Вот модель проекта:

package Main.Model;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;
import java.util.HashSet;

@Entity
@Table(name = "projects")
public class Project {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Integer id;

@Column
@CreationTimestamp
private LocalDateTime created_at;

@Column
@UpdateTimestamp
private LocalDateTime updated_at;

private String name;

private Integer color;

@OneToOne
@JoinColumn(name = "color", insertable =  false, updatable = false)
private Color colors;

public Color getColors() {
    return colors;
}

public void setColors(Color colors) {
    this.colors = colors;
}

public Integer getId() {
    return id;
}

public String getName() {
    return name;
}

public Integer getColor() {
    return color;
}

public void setId(Integer id) {
    this.id = id;
}

public void setName(String name) {
    this.name = name;
}

public void setColor(Integer color) {
    this.color = color;
}

}

РЕДАКТИРОВАТЬ: Вот класс цвета

package Main.Model;

import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
@Table(name = "colors")
public class Color {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Integer id;

@Column
@CreationTimestamp
private LocalDateTime created_at;

@Column
@UpdateTimestamp
private LocalDateTime updated_at;

private String value;

public String getValue() {
    return value;
}

public void setValue(String name) {
    this.value = value;
}


public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

}

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Пользователь @OneToOne(fetch=FetchType.EAGER), так как по умолчанию он будет загружать LAZY.

есть еще один момент, если ваш цвет соединения из класса Color не требуется private Integer color; или если он для чего-то другого, может конфликтовать с @JoinColumn

@OneToOne((cascade = CascadeType.ALL), fetch=FetchType.EAGER)
@JoinColumn(name = "colors", insertable =  false, updatable = false)
private Color colors;

и ваш метод создания проекта также должен установить цвета:

@RequestMapping(path = "/create", method = RequestMethod.POST)
    public Object create(@RequestBody CreateProjectObject object) {

        Project project=new Project();
        project.setName(object.getName());
        project.setColor(object.getValue());
        Color color = new Color();
        color.setId(object.getValue());
        project.setColors(color);
        projectRepository.save(project);
        return this.read();
    }
0 голосов
/ 29 октября 2018

Вы должны добавить CascadeType.ALL в отношение @OneToOne. Кроме того, здесь является простым руководством для понимания отношений JPA.

...