У меня есть вопрос, который я надеюсь четко описать. У меня есть следующие занятия:
@Entity
public class Filter {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY,orphanRemoval = true)
@JoinColumn(name = "filter_id", nullable = false)
private Set<FilterMedication> medications;
//setter and getters are not show
...}
.
@Entity
public class FilterMedication {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@ManyToOne
@JoinColumn(name = "medication_id", nullable = false)
private Medication medication;
// Setters and getters are not shown
.....}
.
@Entity
@Table(name = "medication")
public class Medication {
@Column(name = "generic_name")
private String genericname;
private String name;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
// Setters and getters are not shown
.....}
В основном фильтрует отношения «один ко многим» с FilterMedicaton, а FilterMedication имеет отношения «многие к одному» с лекарством.
Я создал репозиторий для запросов фильтров
public interface FilterRepository extends JpaRepository <Filter, Long> {}
Я могу добавить новый фильтр, отправив следующий объект JSON в функцию save ()
{
"id": 1,
"name": "Test1",
"medications": [
{
"id": 2,
"medication": {
"genericname": "Oxymetazoline HCl Nasal Soln 0.05%",
"name": "12 HOUR NASAL SPRAY 0.05 % NA SOLN",
"strength": "0.05%",
"form": "Solution",
"route": "Nasal"
}
}
]
}
Теперь время для вопроса: есть ли способ передать внешний ключ лекарства вместо полного объекта лекарства, Spring JPA преобразует внешний ключ в соответствующий объект? Код JSON будет примерно таким
{
"id": 1,
"name": "Test1",
"medications": [
{
"id": 2,
"FORIGEN KEY": 1
}
]
}
Технически я могу написать для этого функцию; однако я считаю, что есть лучший и более чистый способ сделать это.
//convert json to java obj
Filter filter = new Gson().fromjson(yourjson, Filter.class);
//get the fiterMedication (id = 2)
int id = filter.getMedications().getId();
FilterMedication filterMedication = filterMedicationRepository.get(id);
Filter newFilter = new Filter();
newFilter.setId(filter.getId());
....//set name
newFilter.getMedications.add(filterMedication);//get the set of medications and add the element filterMedication
//save newFilter