【问题标题】:Spring Boot relation returns nullSpring Boot 关系返回 null
【发布时间】:2018-10-29 08:58:14
【问题描述】:

我对 Spring Boot 关系有疑问。当方法创建返回方法读取(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;
}

}

【问题讨论】:

    标签: java spring-boot relation


    【解决方案1】:

    您必须在 @OneToOne 关系中添加 CascadeType.ALL。此外,here 是了解 JPA 关系的简单教程。

    【讨论】:

    • 我添加了@OneToOne(cascade = CascadeType.ALL),但我仍然得到相同的空指针异常。谢谢你的教程。
    【解决方案2】:

    用户@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();
        }
    

    【讨论】:

    • 不幸的是,我仍然遇到同样的错误。整数颜色与颜色类无关。感谢您的帮助
    • 尝试调试并检查 projectRepository.findAll() 是否正在加载 Color 对象??你能不能也显示你的颜色实体
    • 你能把它改成 name = "colors" not color
    • 在此之后请通过查看表格告诉我您已插入数据..以及 repository.all 返回什么??
    • 如果还是不行,请将您的示例项目发布到 github,我会看看或添加 Color 实体和 CreateProjectObject pojo..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2017-06-27
    • 1970-01-01
    相关资源
    最近更新 更多