Часть этого вопроса связана с JPA, но это больше касается подходов, чем технологий, так что, надеюсь, кто-то сможет дать совет.
Я использую Spring MVC и Hibernate для создания веб-сайта, который позволяет пользователям создавать продукты и описания продуктов. У меня есть объект Product, имеющий двунаправленное отношение «один ко многим» с ProductDescription.
Если при отправке формы, которая привязывается к экземпляру Product и указывает все его ProductDescription, злоумышленник может ввести поддельные идентификаторы для ProductDescription и «похитить» данные других пользователей. Одним из решений этой проблемы было бы всегда создавать ProductDescription заново, поэтому удаляйте их при отправке формы и создавайте новые каждый раз. Это кажется неэффективным из-за дополнительных операций удаления и записи, которые будут необходимы при каждом обновлении Продукта (даже если ProductDesciptions не изменились).
Другой альтернативой может быть проверка «владения» дочерними объектами перед запуском обновления.
Как другие люди могут обойти эту проблему? У большинства людей удаление / вставка или выборочное обновление?
Вот пример того, о чем я говорю: POST:
id=1
name=My Product
descriptions[0].id=123
descriptions[0].text=A lovely description of my product
descriptions[0].price=100
descriptions[1].id=123
descriptions[1].text=Another lovely description of my product in another language
descriptions[1].price=50
И пример класса, о котором я говорю:
public class Product
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToMany(mappedBy = "product")
private Set<ProductDescription> descriptions;
private String name;
}
public class ProductDescription
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private Integer price;
@ManyToOne
private Product product;
private String text;
}