【问题标题】:JSON content for POST request @ManyToOne relationship in Java SpringJava Spring中POST请求@ManyToOne关系的JSON内容
【发布时间】:2017-10-22 05:23:56
【问题描述】:

我有两个模型:
第一课:

import javax.persistence.*;
import java.util.Set;

@Entity
public class One {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    @OneToMany(mappedBy = "one")
    private Set<Many> manySet;

    //Constructor, Getter and Setter
}

类很多:

import javax.persistence.*;

@Entity
public class Many {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    @ManyToOne
    @JoinColumn(name = "one_id")
    private One one;
    //Constructor, Getter and Setter
}

存储库:

import com.hotel.model.Many;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ManyRepository extends JpaRepository<Many, Long> {
}

控制器类:

@RestController
@RequestMapping(value = "many")
public class ManyController {
    @Autowired
    private ManyRepository manyRepository;

    @GetMapping
    @ResponseBody
    public List<Many> getAllMany() {
        return manyRepository.findAll();
    }

    @PostMapping
    @ResponseBody
    public ResponseEntity createMany(@RequestBody Many many) {
        return new ResponseEntity(manyRepository.save(many), HttpStatus.CREATED);
    }
}

我创建了一条 id=1 的记录。 但是当我使用 JSON 数据创建许多记录时:

{
    "name": "Foo",
    "one_id": 1
}

我收到了很多 one_id 的记录是 null
我可以只使用一个请求来创建新的多条记录并分配给一条 id = 1 的记录吗? 我是否必须使用 2 个请求:创建多个并分配给一个?

【问题讨论】:

  • 请同时发布保存数据的代码。
  • 我添加了存储库和控制器类

标签: java spring hibernate jpa many-to-one


【解决方案1】:

你必须像这样更新你的方法

@PostMapping
@ResponseBody
public ResponseEntity createMany(@RequestBody ManyDTO many) {
    
    One one = oneRepository(many.getOne_id()); //Get the parent Object
    
    Many newMany  = new Many(); //Create a new Many object
    newMany.setName(many.getName());
    newMany.setOne(one); // Set the parent relationship
    
    
    ...

}

注意:以上答案仅说明了设置实体关系的方式。应该实际调用适当的服务层。

【讨论】:

  • 感谢您的解决方案。有效。我是否总是必须使用 DTO 类来解决 @ManyToOne 关系?
  • 并非总是如此。如果您不需要设置复杂的关系,通常简单的实体效果很好。但是与上述情况类似的东西需要一个 DTO,因为 json 与您的实际实体及其映射有些不同。
  • 面临同样的问题,在按照上述方法后,外键未插入子表中,效果很好
【解决方案2】:

当您使用以下存储库时,您可以仅使用一个请求将 一个 中的 1 条记录和 许多 表中的多条记录保留

import com.hotel.model.One;
import org.springframework.data.jpa.repository.JpaRepository;

public interface OneRepository extends JpaRepository<One, Long> {
}

另一方面,您可以使用示例中给出的 JpaRepository 在 One 中保留 1 条记录,在 Many 表中保留 1 条记录。

您的问题不清楚,是要保留 One/Many 还是检索 One/Many。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2018-03-12
    • 2019-10-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多