【问题标题】:Receive Spring's Entity with @JoinColumn in RESTful web service在 RESTful Web 服务中使用 @JoinColumn 接收 Spring 的实体
【发布时间】:2016-07-01 13:13:07
【问题描述】:

我有这些表:

CREATE TABLE ref.doc (
    id       serial PRIMARY KEY,
    iddoc    integer NOT NULL UNIQUE,
    docname  varchar(254) NOT NULL
);

CREATE TABLE person (
    id       serial PRIMARY KEY,
    name     varchar(40) DEFAULT NULL, 
    doctype  integer DEFAULT NULL REFERENCES ref.doc(iddoc)
);

我需要使用 Spring 构建一个 RESTful Web 服务,它接收 JSON 并在经过一些验证后将它们保存到数据库中。例如,ref.doc 中有一条带有iddoc = 2 的记录。所以person 的 JSON 看起来像这样:

{
    "name": "John",
    "doctype": 2
}

我想做这样的事情:

@RestController
public class PersonController {

    @Autowired
    PersonRepository personRepository;

    @Transactional
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    @ResponseBody
    public Person add(@RequestBody Person person) {
        // some logic
        personRepository.saveAndFlush(person);
        return person;
    }
}

我有这些实体:

@Entity
@Table(schema = "ref")
public class Doc {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonIgnore
    private long id;

    private Integer iddoc;
    private String docname;

    ...
}

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonIgnore
    private long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "doctype", referencedColumnName = "iddoc", nullable = false)
    private Doc doc;

    ...
}

在这种情况下,person 中的doc 始终是null,这很容易理解。但是如何实现我需要的行为呢?

【问题讨论】:

    标签: java spring rest spring-data-jpa


    【解决方案1】:

    你看过这个链接吗?

    http://www.javaworld.com/article/2077819/java-se/understanding-jpa-part-2-relationships-the-jpa-way.html

    特别看一下order表和customer表的关系。

    据我了解,您需要一个人来拥有多个文档。 所以尝试改变定义

    private Doc doc;
    

    @OneToMany(mappedBy="person", fetch=FetchType.EAGER)
       private List<Doc> docs;
    

    并在 Doc 类中尝试添加:

     @ManyToOne(optional=false)
     @JoinColumn(name="doctype",referencedColumnName="iddoc")
       private Person person;
    

    这应该是实现您需要的行为的正确方法,而不是 100% 确定。 这是另一个链接,解释了如何实现您需要的解决方案:

    https://en.wikibooks.org/wiki/Java_Persistence/OneToMany

    【讨论】:

      【解决方案2】:
              @RestController
              public class PersonController {
      
                  @Autowired
                  PersonRepository personRepository;
      
                  @Autowired
                  DocRepository docRepository;
      
                  @Transactional
                  @RequestMapping("/add")
                  @ResponseBody
                  public void add(@RequestBody Person person) {
                      Doc doc=docRepository.findByIddoc(person.getDoc().getIddoc());
                      if(!(doc==null)){
                      Person personAdd=new Person();
                      personAdd.setName("name");
                      personAdd.setDoc(doc);
                      personRepository.saveAndFlush(person);
                      }
                  }
              }
      
      
      
          @Entity
          public class Person {
      
              @Id
              @GeneratedValue(strategy = GenerationType.IDENTITY)
              @JsonIgnore
              private long id;
      
              private String name;
      
              @ManyToOne(cascade=CascadeType.ALL)
              @JoinColumn(name = "doctype", referencedColumnName = "iddoc", nullable = false)
              private Doc doc;
      
      
      
      
      
      
      @Entity
      @Table(schema = "demo")
      public class Doc {
      
          @Id
          @GeneratedValue(strategy = GenerationType.AUTO)
          @JsonIgnore
          private long id;
      
          private Integer iddoc;
          private String docname;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 2015-02-20
        • 2017-01-12
        • 2018-10-25
        • 1970-01-01
        • 1970-01-01
        • 2015-04-03
        相关资源
        最近更新 更多