2017-01-20 8 views
2

Если у меня есть объект, который содержит объект с другим классом, например, Book лица, которое имеет в нем Publisher объекта, связанные следующим образом:Весной загрузки JPA, как правильно POST объект, чье представление объекта имеет ассоциацию внешних ключей с другим объектом?

@ManyToOne 
@JoinColumn(name="PUB_CODE", referencedColumnName = "PUB_CODE") 
private Publisher pub; 

Это безопасный/правильно (я видел правильные данные в БД в этом примере, но не на 100% уверены, что он будет работать во всех случаях) подходит для публикации объекта с ассоциацией внешних ключей в базе данных? Я не знаю, безопасно ли это с точки зрения атомарности транзакций или с точки зрения потоковой обработки, или если это эффективно. Соответствующий код ниже:

Book.java

package app.domain; 

/*imports*/ 

@Entity 
public class Book implements Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -6902184723423514234L; 

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

    @Column(nullable = false, unique=true) 
    private String bookName; 

    @Column(nullable = false) 
    private int pageCount; 

    @ManyToOne 
    @JoinColumn(name="PUB_CODE", referencedColumnName="PUB_CODE") 
    private Publisher pub; 


    /*public getters and setters*/ 

} 

Publisher.java

package app.domain; 

/*imports*/ 

@Entity 
public class Publisher implements Serializable { 

    private static final long serialVersionUID = 4750079787174869458L; 

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

    @Column(name="PUB_CODE",nullable = false, unique = true) 
    private String publisherCode; 

    @Column(nullable = false) 
    private String publisherName; 

    /*public getters and setters*/ 

} 

BookRepo.java

package app.service; 

/*imports*/ 

public interface BookRepo extends JpaRepository<Book, Long>{ 

    @Query("SELECT pb FROM Publisher pb WHERE pb.publisherCode = TRIM(UPPER(:pubCode))") 
    public Publisher findPublisherByPubCode(@Param("pubCode")String pubCode); 
} 

BookController.java

package app.controller; 

/*imports*/ 

@RestController 
@RequestMapping(value = "/books") 
public class BookController { 

    private BookRepo bookRepo; 

    @Autowired 
    public BookController(BookRepo bookRepo) { 
     this.bookRepo = bookRepo; 
    } 
    //The ApiPathParam is for JSONDOC purposes 
    @RequestMapping(value = "/create", method = RequestMethod.POST) 
    public List<Book> create(@ApiPathParam(name = "book") @RequestBody Book book, @ApiPathParam(name = "pubCode") @RequestParam("pubCode") String pubCode) { 
     // Assume exception handling 
     Publisher pbToAttachToThisBook = bookRepo.findPublisherByPubCode(pubCode); 
     book.setPub(pbToAttachToThisBook); 
     bookRepo.save(book); 
     return bookRepo.findAll(); 
    } 
} 

Сообщение Объект тела (вход в инструмент POST): ввод параметров

{ 
    "bookName": "goosebumps", 
    "id": 0, 
    "pageCount": 332, 
    "pub": { 
    "id": 0, 
    "publisherCode": "", 
    "publisherName": "", 
    "serialVersionUID": 0 
    }, 
    "serialVersionUID": 0 
} 

pubCode при условии, также в инструмент POST, в том же виде вызова выше: 'SC'

После выполнения вышеуказанного кода в Книжной таблице была запись для книги выше, с ее PUB_CODE столбец внешнего ключа, заполненный 'SC', и возвращенный метод контроллера POST List<Book>, который был вызван, показал, что недавно добавленная книга включала в себя информацию об объекте Publisher (например, полное имя «Scholastic») для издателя с уже существующим PUB_CODE='SC' в базе данных.

спасибо.

ответ

0

технику вы вывесили первоначально (передавая FK ID, извлекая его вручную в контроллере, и установив его на предприятие явно) является действительным и безопасным.

Я не знаю более чистого подхода, если не перейти к HATEOAS принципалов, что позволяет для обработки ссылок ресурса: http://projects.spring.io/spring-hateoas/

0

Похоже, что вам нужно separate/decoupledata layer's domain model от вашего Rest Resources/ API specs, так как они могут развиваться в разном темпе. Также ваш выбор JPA не должен влиять на API specs.

Должно это чувство, как то, что вы хотите, чтобы продолжить там много ресурсов там, включая Best Practices for Better RESTful API

+0

Пожалуйста, смотрите мой выбор. У меня сложилось впечатление, что домен и сервисы должны быть разделены. Это неправильно? – ITWorker

 Смежные вопросы

  • Нет связанных вопросов^_^