2016-07-01 11 views
0

Ich habe diese Tabellen:Erhalten Spring Entity mit @JoinColumn in RESTful Web Service

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) 
); 

Ich brauche einen RESTful Web-Service mit Spring zu bauen, die JSONs und speichert sie in der Datenbank nach einer gewissen Überprüfung empfängt. Zum Beispiel gibt es einen Datensatz mit iddoc = 2 in ref.doc. So ist die JSON für person sieht wie folgt aus:

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

Und ich möchte etwas tun:

@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; 
    } 
} 

Ich habe diese Entitäten:

@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; 

    ... 
} 

Und in diesem Fall doc in person ist immer null, und es ist ziemlich verständlich. Aber wie implementiert man das Verhalten, das ich brauche?

Antwort

0

Kennen Sie diesen Link?

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

Insbesondere Blick auf die Beziehung zwischen Auftragstabelle und Kundentabelle.

Für was ich verstanden habe, benötigen Sie eine Person, um mehrere Dokumente zu haben. So versuchen, die Definition

private Doc doc; 

zu

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

und in Doc-Klasse zu ändern versuchen, diese hinzufügen:

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

dies der richtige Weg sein sollte, das Verhalten, das Sie benötigen, zu implementieren, nicht 100% sicher. Hier ist ein weiterer Link, der zeigt wie die Lösung zu erreichen, benötigen Sie:

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

0
 @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;