2016-10-31 3 views
0

У меня есть реляционная база данных с нормализованной формой моих данных, но мой API должен будет получить информацию денормализованным способом, каков правильный способ справиться с этим? Это вопрос создания новой конечной точки с денормализованными полями?Опубликовать реляционные данные, Spring JPA REST

Как бы я отделил это от базы данных, чтобы Spring Boot не создавал для меня новую таблицу?

К примеру, здесь (некоторые) мои таблицы:

@Entity 
public class TestCase { 
    @Id @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
    private String name; 
    private String description; 
} 

@Entity 
public class TestRun { 
    @Id @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id;  
    private Boolean result; 
    private String username; 
    @OneToOne 
    private TestData testData; 
    @ManyToOne 
    private TestCase testCase; 
} 

@Entity 
public class TestData { 
    @Id @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
    private int count; 
    @ManyToOne 
    private RecordType recordType; 
} 

Я хочу создать API конечной точку, которая будет создавать новые записи в TestRun и Testdata в то же время, в то время как ссылки на существующие записи в TestCase и RecordType.

Как это делается?

Полный ответ должен показать:

  • Какого формата данные будут принимать, когда его отправили на сервер
  • Какого компонента будет обрабатывать этот пост
  • Как этот компонент будет обновлять различные Сущности
+0

что вы имеете в виду с денормализованной? – cralfaro

+0

Когда я отправляю данные в свой API, я хочу отправить все поля, показанные выше, как один запрос. Но я хочу, чтобы этот запрос разбился и поместился в нужные таблицы. – clickcell

+0

вы можете отправить уникальный запрос с двумя объектами, и запрос будет читать их как 2 объекта, затем вы можете обработать их по своему усмотрению и сохранить сначала один в одну таблицу, а затем другую или любую другую, что вам нужно. Также, если вы добавите cascadeType = PERSIST в свои отношения, сохраняя только родительский объект, все отношения будут сохранены. – cralfaro

ответ

0

Если добавить @Cascade({CascadeType.SAVE_UPDATE}) ко всем отношениям с @OneToOne и @ManyToOne когда сохраняются объект TestRun все существующие объекты также должны сохраняться.

public class TestRun { 
    @Id 
      @GeneratedValue(strategy = GenerationType.AUTO) 
      @Column(name="id", columnDefinition = "numeric") 
      private Long id; //Long so default value is null 
      @Column(name="result", columnDefinition ="nchar") 
      private Boolean result; 
      @Column(name="username") 
      private String username; 

      @OneToOne 
      @JoinColumn(name="id_data") 
      @Cascade({CascadeType.SAVE_UPDATE}) 
      private TestData testData; 

      @OneToOne 
      @JoinColumn(name="id_case") 
      @Cascade({CascadeType.SAVE_UPDATE}) 
      private TestCase testCase; 
} 

Вход: { "result" : "true", "username" : "clickcell", "testData" : { "count" : "10" }, "testCase" : { "name" : "test1", "description" : "the first test" } }

+0

Спасибо, не могли бы вы рассказать о том, как я смогу опубликовать данные в API? Смогу ли я отправлять все данные в один POST и могу ли я ссылаться на существующие записи по их идентификационным номерам? Например, я хочу сказать, что у меня есть новый тестовый прогон (test case id6), который создал 5 записей тестовых данных (тип записи id4). – clickcell

+0

Вы сможете отправить все данные в одном сообщении. Объект, который отправляется в сообщение, должен соответствовать структуре полей из TestRun. Если есть идентификаторы, менеджер объектов обновит существующие строки в базе данных и вставляет те, у которых нет идентификатора. –

+0

Вопрос в том, как. Скажем, я отправляю «{» result »:« true »,« username »:« clickcell »,« testData »: {« count »:« 10 »,« recordType »:« 4 »},« testCase »: {" name ":" test1 "," description ":" the first test "}}' Это не работает, потому что он создает объект testData как пустой. Вы видите, что я спрашиваю сейчас? – clickcell

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